Почему это только половина возврата? - PullRequest
0 голосов
/ 04 февраля 2020

Я почти все заработал, за исключением 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...