帮我调试这个没有编译错误但是没有按预期工作的代码块

nub*_*ela 0 java

我正在使用以下算法对此Sudoku Solver进行编码:

给定一个被认为是有效的数独谜题的网格,并且存在至少1个解决方案,它将找到第一个解决方案并将其返回.

拼图存储在代表9x9插槽的2D数组中.

如果解决方案不存在,则返回拼图[0] [0] = 0的拼图,否则拼图中的所有插槽都应填充值(1-9).

该算法是一种强制递归方法:

  1. 它逐行搜索拼图以获得单个插槽.
  2. 该方法possibleValuesInGrid()根据当前拼图及其现有值返回可适合插槽的可能值.
  3. 如果插槽中没有可能的值,则返回False(puzzle [0] [0] = 0)
  4. ELSE,它弹出LinkedList可能值中的一个值并插入到插槽中,并再次递归调用相同的方法,直到所有插槽都被填满.

代码是在pastebin上托管所以我不会泛滥这个页面.我怀疑某处可能存在逻辑错误,尽管它是一种强力方法,甚至是我似乎无法想象的错误.

我已经硬编码了一些系统打印行来读取逻辑错误,但是我无法弄清楚在哪里.

另外,它如何在[8] [4]停止也很好奇.

Gal*_*mon 5

您的代码失败,因为您在多维数组上使用克隆(第44行).克隆只给你一个浅拷贝,在二维数组的情况下,这不够好.你需要System.arraycopy(),但是在每一行上都要调用类似的东西

public void 2dArrayCopy(int[][] source,int[][] target) {
    for (int a=0; a<source.length; a++) {
        System.arraycopy(source[a],0,target[a],0,source[a].length);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在第49行的日志中看到失败克隆的症状,其中代码突然看到一个带有0:0空插槽的拼图.