0

我正在使用递归制作数独求解器,但遇到了一些问题。我将注释放在我的变量和函数旁边,以尽可能清楚地说明这一点。我的逻辑听起来像这样可行吗?我的代码中的其他所有内容都有效。这只是求解器/递归它不是。

bo


boourn 
    f nt j=0; j < 9; j++)
    rowc c=0;
           8) //if row is past 8 then the board is done

            return true;


    for (int < 10; i++)
    {

                    nextr r; //save next row and col
                    next;
                    tcol++; /ncrement next col and row
                     (nextcol >8) {
                nextcol =0;
                nx
            if(ncol==0 && nextrow ==9)
    r(0, 0
}
4

2 回答 2

0

您提供的solver函数实际上查看了整个数组,并且 - 如果代码中使用的其他函数正常工作 - 应该实际上解决了这个难题。如果您替换cout << " TRUE TRUE "<<endl;cout << "["<<r<<"]["<<c<<"]: "<<i<<endl;您会注意到所有索引都已检查。

因此,问题必须出在您未提供代码的 3 个函数之一中row_validcol_validpanel_valid.

注意: 我不认为在这个特定问题中使用递归是一个好主意。您可能应该只使用 afor来检查和解决电路板。那会更快更容易。

第一篇文章更新后编辑

row_validandcol_valid函数不太有效。您不能检查c !=i零件,因为它会使所有检查都为假。将 if 语句更改为:

if (v == rowcol[i][c] && v!=0)

if (v == rowcol[r][j] && v!=0)

你也需要改变solver一点:

bool sudoku :: solver(int r, int c) {
   while( r < 9 && rowcol[r][c] !=0) {
    c++;
    if ( c>8) {
        c=0;
        r++;
    }
    if (r > 8) {
        return true;
    }
  }
  for (int i=1; i < 10; i++)
  {
    int nextrow, nextcol;
      if (row_valid (r, c, i)&& col_valid(r, c, i)&& panel_valid(r,c, i)) {
        rowcol[r][c]=i;
        nextrow=r; //save next row and col
        nextcol=c;
        nextcol++; //increment next col and row
        if (nextcol >8) {
            nextcol =0;
            nextrow++;
        }
        if(nextcol==0 && nextrow ==9) {
            return true; //then it's done
        }
        if (solver(nextrow,nextcol)) {
            return true;
        }
        else{
            rowcol[r][c]=0;
        }
      }
   }
   return false;
}

这似乎对我有用,并给我一个输出:

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 2 9 7 8
6 4 2 9 7 8 5 3 1
9 7 8 5 3 1 6 4 2
于 2013-11-10T04:29:27.273 回答
0

根据您的评论回复,是的:

正确编码。

使用应该使用的方法并正确命名它们。
InitilalizeBoard填满所有零。
已将SetBoard起始值放在板上。
SolveBoard尝试解决它。

让每个方法做一件事情并明确其名称是一个很好的编程习惯。

话虽如此,几年前我也做过类似的事情。与使用 for/while 循环的蛮力方法解决数独相比,甚至将其编码为高效并尝试像人类一样解决数独(删除选项显然是错误的等等)。

因此,根据您的最终结果,您可能希望对其进行适当的编码......(我这样做是为了刷新我的 C++,所以不在乎先做难的、长的路,然后再做短的路)。

于 2013-11-10T04:36:27.697 回答