低レベルコースでの割り当てとして再帰を扱うのは初めてのことです。私はインターネットの周りを見てきました。私は思いついた方法に似た方法を使っている人がいないように見えます。エラーは、私が仮定しているstd::__copy_move...
のセグメンテーション違反です.C++ STLの中に何かがあります。次のように とにかく、私のコードは次のとおりです。再帰バックトラック数独ソルバー問題、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とは何かを書くことから始まります。 (x、y、val)は、他の(x、y)pairesで何度もvalを代入しようとしますが、それが(x、y)で有効でない場合はどうなりますか? – lkanab