這是我第一次將遞歸作爲一個低級別課程中的任務。我環顧了互聯網,我似乎無法找到任何人使用類似於我提出的方法(可能會說爲什麼這不起作用)。該錯誤是std::__copy_move...
中的一個段錯誤,我假設它是C++ STL中的一個東西。 Anywho,我的代碼如下:遞歸回溯數獨求解問題,C++
bool sudoku::valid(int x, int y, int value)
{
if (x < 0) {cerr << "No valid values exist./n";}
if (binary_search(row(x).begin(), row(x).end(), value))
{return false;} //if found in row x, exit, otherwise:
else if (binary_search(col(y).begin(), col(y).end(), value))
{return false;} //if found in col y, exit, otherwise:
else if (binary_search(box((x/3), (y/3)).begin(), box((x/3), (y/3)).end(), value))
{return false;} //if found in box x,y, exit, otherwise:
else
{return true;} //the value is valid at this index
}
int sudoku::setval(int x, int y, int val)
{
if (y < 0 && x > 0) {x--; y = 9;} //if y gets decremented past 0 go to previous row.
if (y > 8) {y %= 9; x++;} //if y get incremented past 8 go to next row.
if (x == 9) {return 0;} //base case, puzzle done.
else {
if (valid(x,y,val)){ //if the input is valid
matrix[x][y] = val; //set the element equal to val
setval(x,y++,val); //go to next element
}
else {
setval(x,y,val++); //otherwise increment val
if(val > 9) {val = value(x,y--); setval(x,y--,val++); }
} //if val gets above 9, set val to prev element,
} //and increment the last element until valid and start over
}
我一直在試圖總結我的頭圍繞這件事了一會兒,我似乎無法找出什麼地方出了錯。任何建議都非常感謝! :)
什麼是矩陣?在不知道這些細節的情況下,很難爲您調試代碼。 – Flexo
我認爲你應該重溫算法設計。在遞歸的'if'部分,你在遞歸之前檢查了有效性,在'else'部分中,你沒有進行有效性檢查。另外,你只能在遞歸之後檢查'val> 9'。 – arne
首先寫入setval做什麼。特別是想: if(!valid(x,y,val))setval嘗試在其他(x,y)paire中重複指定val,但如果它對任何(x,y)無效怎麼辦? – lkanab