Переменная класса возвращается к исходному значению после вызова метода 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 покажет обновленные значения. Я надеюсь, что этот намек, возможно, поможет вам.