繁体   English   中英

Java:递归数独解决方案计数算法

[英]Java: Recursive sudoku solutions counting algorithm

我很轻松地制作了Sudoku检查器/求解器,但是我需要一个可以告诉Wheter有不止一种解决方案并且无法解决的解决方案。 我找到了一个有效的算法,但是我想了解它为什么起作用。 这是这个问题的答案,由@fabian提供

复制如下:

// returns 0, 1 or more than 1 depending on whether 0, 1 or more than 1 solutions are found
static byte solve(int i, int j, int[][] cells, byte count /*initailly called with 0*/) {
    if (i == 9) {
        i = 0;
        if (++j == 9)
            return 1+count;
    }
    if (cells[i][j] != 0)  // skip filled cells
        return solve(i+1,j,cells, count);
    // search for 2 solutions instead of 1
    // break, if 2 solutions are found
    for (int val = 1; val <= 9 && count < 2; ++val) {
        if (legal(i,j,val,cells)) {
            cells[i][j] = val;
            // add additional solutions
            count = solve(i+1,j,cells, count));
        }
    }
    cells[i][j] = 0; // reset on backtrack
    return count;
}

我尝试实现它,并且应该起作用。 但是,尽管我认为我了解代码的每个部分的功能,但是我无法理解它为什么起作用。

First :一旦到达2d数组中的最终编号,第一个if语句将停止该方法。 我在找到一个解决方案时就明白了这一点,但是为什么在找到多个解决方案时又起作用呢? 找到解决方案后,方法不应该只返回0 + 1 = 1吗?

第二 :在if (cells[i][j] != 0)为什么递归solve(...)调用需要在它前面使用return语句? 我做了几种递归算法,但是总是通过再次调用该方法。

第三 :如果找不到合适的数字,则for循环停止,并将0输入到单元格位置。 由于它应该已经为0,所以回溯不应该将0而不是当前放在最后吗? 至少这就是我创造自己的求解器的方式。

第四 :回溯设置之后,只有return count 为什么程序仍然可以运行? 它不应该只返回count = 0并在遇到不允许任何数字的第一位之后停止吗? 到底怎么没有递归调用?

如果您在这个棘手的问题上取得了如此长的成就,那么很明显,我正在理解某些完全错误的事情。 我非常感谢您的协助/解释,因为就学习编码而言,使用一个无法理解的代码是完全失败的。

好的,因此Google优雅地提供了哈佛大学的Powerpoint讲座: http : //www.fas.harvard.edu/~cscie119/lectures/recursion.pdf

如果其他人在递归回溯方面遇到问题,建议您进行检查。 非常简短,但内容丰富。

我的问题似乎仅仅是我愚蠢地(至少是事后看来)认为该方法在递归调用后停止。 我忘记了在它从递归调用中获得结果后,它会自行执行到最后。 有趣的是,您仅用最初的思维过程就存在缺陷,如何花十个小时来解决某些问题。 好吧,生活和学习,我猜。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM