Я почти все заработал, за исключением 1 ошибки, когда он пытается вернуться, когда предыдущий элемент находится в последней строке. Это будет половина пути назад, а затем продолжить. да, я знаю, что кодирование в основном не очень хорошая техника. Нам не разрешено использовать рекурсию. Если бы кто-нибудь мог помочь, я был бы очень признателен. Я застрял на этом в течение нескольких часов
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
int size = 8;
int permrow = 2, permcol = 1;
permcol--;
permrow--;
vector<int> inputrows;
vector<int> inputcols;
inputcols.push_back(permcol);
inputrows.push_back(permrow);
bool board[size][size];
bool rowsused[size];
// create board and set each row to unused
for(int i = 0; i < size; i++) {
rowsused[i] = false;
for(int j = 0; j < size; j++) {
board[i][j] = false;
}
}
// set the permanent pieces
for(int i = 0; i < inputcols.size(); i++) {
board[inputrows[i]][inputcols[i]] = true;
rowsused[inputrows[i]] = true;
}
// to track cols and rows used
int countcol = 0;
int countrow = 0;
// makes sure to start at the first available row
for(int i = 0; i < inputcols.size(); i++) {
if(inputcols[i] == countcol) {
countcol++;
i = 0;
}
}
bool done = false;
bool permcolsused = false;
bool permrowused = false;
bool nosolution = false;
stack<int> savelastrow;
while(done == false) {
for(int i = 0; i < size; i++) {
for(int j = 0; j < size; j++) {
cout << board[i][j];
}
}
// check if ur on any permanently placed piece's row or column. if you are,
// move forward 1 spot in whichever direction necessary and restart loop
permrowused = false;
permcolsused = false;
for(int i = 0; i < inputcols.size(); i++) {
if(countcol == inputcols[i]) {
countcol++;
permcolsused = true;
break;
}
else if(countrow == inputrows[i]) {
countrow++;
permrowused = true;
break;
}
}
if(permrowused == true || permcolsused == true) {
continue;
}
// check if the spot you are about to check is already taken
if(board[countrow][countcol] == true) {
countrow++;
continue;
}
// if every row has been taken in that column, move the previous piece
if(countrow >= size) {
countcol--;
if(savelastrow.empty()) {
break;
}
rowsused[savelastrow.top()] = false;
countrow = savelastrow.top() + 1;
if(countrow >= size - 1) {
countrow = 0;
}
board[countcol][savelastrow.top()] = false;
savelastrow.pop();
continue;
}
// check if the general row you are about to check is already taken
if(rowsused[countrow] == true) {
countrow++;
continue;
}
if(countcol < 0) {
nosolution = true;
break;
}
int tempcol = countcol;
int temprow = countrow;
bool hitsadiag = false;
while(tempcol > 0 && temprow < size - 1) {
temprow++;
tempcol--;
if(board[temprow][tempcol] == true) {
hitsadiag = true;
break;
}
}
tempcol = countcol;
temprow = countrow;
while(temprow > 0 && tempcol < size - 1) {
if(hitsadiag == true) {
break;
}
temprow--;
tempcol++;
if(board[temprow][tempcol] == true) {
hitsadiag = true;
break;
}
}
tempcol = countcol;
temprow = countrow;
while(temprow < size - 1 && tempcol < size - 1) {
if(hitsadiag == true) {
break;
}
temprow++;
tempcol++;
if(board[temprow][tempcol] == true) {
hitsadiag = true;
break;
}
}
tempcol = countcol;
temprow = countrow;
while(temprow > 0 && tempcol > 0) {
if(hitsadiag == true) {
break;
}
temprow--;
tempcol--;
if(board[temprow][tempcol] == true) {
hitsadiag = true;
break;
}
}
if(hitsadiag == true) {
countrow++;
continue;
}
board[countrow][countcol] = true;
rowsused[countrow] = true;
savelastrow.push(countrow);
countcol++;
countrow = 0;
if(countcol >= size) {
break;
}
}
}