Переменная класса возвращается к исходному значению после вызова метода C++

Я пишу решатель судоку с рекурсией и возвращением. Я написал 2 версии, первая с использованием только функций (стиль C) и одна с классами и объектами.
Первый работает, и большая часть кода была перенесена на второй.
Второй вроде работает. Точнее, головоломка решается правильно, но как только я выхожу из области действия solver(), приватная переменная, в которой хранится доска, возвращается к своему первоначальному значению. Мое объявление класса:

class Sudoku
{
private:
    string contents;
    vector<vector<int > > board;
    int puzzleType;
int difficulty;

public:
    Sudoku();
    Sudoku(vector<vector<int>> b);
    void loadFile(string filename);
    void fillBoard();
    void solve();
    int isFull();
    void printBoard();
    vector<int > possibleEntries();
    void lengthCheck();
    int hexRecognition(char str);
    int getValue(int y,int x);
    vector<int> possibleEntries(int yi, int xj);
};

Мой конструктор Судоку:

Sudoku::Sudoku():puzzleType(0), difficulty(0){
loadFile("/Users/{username}/Documents/xcode/hello/hello/hello/hard.txt");
lengthCheck();
fillBoard();
}

Мой основной:

int main(int argc, const char * argv[]) {

Sudoku puzzle;
puzzle.printBoard();
puzzle.solve();
puzzle.printBoard();

return 0;
}

Выход я получаю 3 доски:

  • Нерешенный, как и ожидалось
  • Решенный, как и ожидалось. Который печатается вызовом printBoard() внутри solve()
  • Еще один нерешенный, сгенерированный printBoard() в main().

Я предполагаю, что моя ошибка связана с тем, как я объявляю переменную, или с тем, как она передается в методе execute(). Двойная векторная доска передается как значение, а не как ссылка, как я могу преодолеть это?
Моя цель состоит в том, чтобы вывести 3 загадки, первая нерешенная, а две другие решены.

====== РЕДАКТИРОВАТЬ ======= Код для метода решения ():

void Sudoku::solve(){
    int x,y,i,j;
    string str;
    vector<int> possibilities(9,0);
    difficulty++;
    y=0;
    x=0;
    if (isFull())                   //Checks if the board is full
    {
        for (i=0; i<=20; i++) {     //"Clears" console
            cout<<endl;
        }
        cout<<"Solution:"<<endl;
        printBoard(); //If board is complete then prints it and returns
        cout<<"The puzzle used, "<<dec<<difficulty<<" iterations."<<endl;
    }
    else
    {
        for (i=0; i<=puzzleType-1; i++) {   //Looks for the first empty cell
            for (j=0; j<=puzzleType-1; j++) {
                if(board[i][j]==0)
                {
                    y=i;
                    x=j;
                    break;
                }
            }
        }
        possibilities = possibleEntries(y, x);  //fills vector with possible values
        for (i=0; i<=8; i++)
        {
            if (possibilities[i]!=0)
            {
                board[y][x]=possibilities[i];   //Fills cell with poss #
                this->solve();                  //calls with the new board
            }
        }
        board[y][x] = 0; //backtracking
    }    
}

1 ответ

Пытаться:

vector<vector<int > >& board;

Я верю, что это решит вашу проблему.

РЕДАКТИРОВАТЬ

внутри ветви else метода execute вы задаете:

плата [Y][х]= возможности [I];

и тогда вы звоните:

этом-> решения ();

когда вы входите в ветвь if, вызывается метод printboard(), и теперь выполняются следующие операторы в вызовах метода предварительного просмотра решить, то есть:

доска [у][х] = 0; // возвраты

Итак, некоторые значения изменены, и следующий вызов функции puzzle.printboard() внутри main покажет обновленные значения. Я надеюсь, что этот намек, возможно, поможет вам.

Другие вопросы по тегам