- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在做家庭作业的数独解题器,但遇到了一些困难。现在的代码循环通过解决方案,尽管它确实会遇到简单的谜题,而对于较难的谜题,它会无缘无故地卡在几个 9 上。我将不胜感激任何帮助。 (check_cell 判断放置是否有效。)
部分代码:
def solve_helper(self, row, col):
# Try placing a number in each column of current row
board = self.the_board
if board[row][col] != 0:
?????
elif board[row][col] == 0:
for i in range(1,10):
print("Setting value at i with ") + str (i) + (" located at " ) + str(row) + str(col)
self.set_cell(row, col, i)
self.guesses = self.guesses + 1
if self.check_cell(row, col):
if self.solve_helper(row, col): return True
else:
self.set_cell(row, col, 0)
else:
return self.mover(row,col)
return False
def mover(self, row, col):
if col + 1 != 9:
return self.solve_helper(row, (col+1))
elif row + 1 != 9:
print "Moving to row" + str(row + 1)
return self.solve_helper((row+1),0)
else:
print "SOLUTION FOUND"
return True
最佳答案
您遇到的问题是您的某些递归调用没有正确返回结果,因此您的解决方案在找到后会被遗忘到递归堆栈的几层。这是您需要的第一个修复,将 return
添加到 mover
中进行的递归调用:
def mover(self, row, col):
if col + 1 != 9:
return self.solve_helper(row, (col+1)) # added return
elif row + 1 != 9:
print "Moving to row" + str(row + 1)
return self.solve_helper((row+1),0) # here too
else:
print "SOLUTION FOUND"
return True
在您跳过预求解单元格的 solve_helper
函数的特殊情况下,您还需要类似的东西。函数的结尾应该是:
else:
return self.mover(row, col) # added return
return False
编辑:
好的,我在代码中发现了一些问题。其中两个是求解器的逻辑问题,一个是显示问题,除了在求解过程中看起来很奇怪之外不会导致任何实际问题。
问题:
solve_helper
调用自身,而不是调用 mover
。这使得它在移动之前需要额外的函数调用(尽管我认为它实际上可能不会破坏求解器)。solve_helper
将一个单元格设置为 9,但随后回溯到(在无法求解后面的一些单元格之后),在进一步回溯之前,9 不会重置为零。 第一个问题很容易解决。只需将 solve_helper
调用更改为 mover
调用即可。这实际上就是您在问题中输入的原始代码中的内容。直接调用 solve_helper
实际上并没有得到错误的结果(因为 solve_helper
会第二次跳过已经填好的单元格),但是它为每个单元格添加了不必要的额外函数调用递归的级别。
第二个问题有点复杂,这是您在某些板上卡住的地方。您需要做的是将执行 self.set_cell(row, col, 0)
的行移出它当前所在的 else
block 。事实上,您可以实际上,如果您愿意,可以将它完全移出循环(因为只有当您在当前单元格的所有值都不起作用后进行回溯时,才真正需要这样做)。以下是我认为这是 for 循环的最佳安排(同时将 return False
语句向上移动):
for i in range(1,10):
print("Setting value ") + str (i) + (" at " ) + str(row) + ", " + str(col)
self.set_cell(row, col, i)
self.guesses = self.guesses + 1
if self.check_cell(row, col):
if self.mover(row, col):
return True
print "Backtracking"
self.set_cell(row, col, 0)
return False
最后,解决显示问题需要进行两项更改。首先,去掉 set_cell
中的条件。您希望始终更新显示。接下来,在 update_textfield
中,将 delete
调用移到 if
block 之外,使其始终发生(保留 insert
在 if
下)。这使得将单元格设置为零会删除先前的值,但不会使其显示实际的 0 字符(它不会显示任何内容)。
我认为应该这样做。请注意,您使用的算法仍然很慢。求解a board I found on the internet in a quick Google search花了 122482 次猜测和超过 5 分钟,但它终于成功了。其他棋盘(尤其是那些在前几个空位需要 8 或 9 的棋盘)可能需要更长的时间。
关于具有强力回溯错误的 Python 数独递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354353/
我的填充数独板的代码如下所示: public class SudokuBoard { static int N = 9; static int[][] grid = new int[N
我正在使用“强力”随机方法创建一个数独生成器。我已经能够使用以下代码检查 x/y 轴是否有重复数字: for(l=0; l<9; l++){//Makes all vertical work.
我有一个数独谜题求解器,需要我们使用递归。问题是我检查可用空间的 boolean 值应该通过引用更新当前位置,但事实并非如此。什么会导致这个? public boolean solve() {
我正在尝试为我的项目制作一个数独游戏,但如果我增加数独Grid中的空白空间数量,代码只会抛出异常arrayoutofbounds但是无法弄清楚它来自哪里。 k 是网格中空白空间的数量。 我没有尝试过任
当我尝试编写一个解决数独问题的程序时,我的代码中有一个错误。 我的程序可以运行,但运行效果不佳。它只解决程序中的第一行。 我认为我在那行代码上犯了错误: int ft_rezolva(int **t)
这是我的。该方法应输出该空间中所有可用数字的数组。出于某种原因,这不会过滤掉相同的框/行/列。应该如何正确编码? public int[] getAllowedValues(int row, in
我遇到了一个问题。我是 Java 的新手,正在尝试尝试比以前更复杂的东西。这是我自己的个人文件输入和主要方法与其他方法的一些蚕食源的组合。我对递归仍然很生疏。出于某种原因,更改二维数组“板”中值的分配
嘿,我无法让代码比较给定行或列和 block 的整数,以确保这些参数中没有重复项。我不知道用 3 种不同的方法分离这三个约束是否是一个好主意,或者只是尝试一次完成所有的操作。 public stati
我正在研究 javascript 数独游戏,就输入验证而言,我很困惑。当每个值都输入到数独表中时,我有一个 onkeyup 触发一个函数,我试图用它来确保没有值进入已经存在这样一个值的行/列/框。这是
我正在研究一个小的个人数独游戏并试图扩展它。 到目前为止,我使用递归回溯方法使“求解”部分正常工作,该方法在设法求解递归时返回 true。 现在我正在尝试构建一个独特的解决方案板生成器,并且我在网上找
数独回溯法 int xx = (pos.getX() / 3) * 3; int yy = (pos.getY() / 3) * 3; for (int y =
我是 c++ 的新手,在做作业(数独)时遇到了问题。 说明说:“你必须创建一个新板作为当前板的拷贝(使用复制构造函数并使用 new) 从堆中分配板。” 我试过了(写在board.cc中): #incl
我目前正在使用 java 制作数独游戏,但我似乎无法弄清楚如何正确地循环我的扫描仪。到目前为止,它打印了这个: . 1 . | 3 . . | 8 . . 5 . 9 | 6 . . | 7 . .
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 12 个月前关闭。 Improve
我正在一个由随机生成的数字(从 1 到 4)填充的多维数组中创建一个 4x4 数独游戏。现在我必须搜索重复项并用其他随机数替换它们,直到单行、单列和四个 2x2 子矩阵上都有唯一的数字。我怎样才能做到
我正在制作一个数独板 GUI,它应该看起来像这样 http://www.sudoku.4thewww.com/Grids/grid.jpg 由于某种原因,它只显示最后一个 3*3 板。如果有人能告诉我
嘿,我写了这个程序来解决数独问题,但它只适用于数独矩阵的几个单元格,而其他单元格则返回 0 。你能明白这有什么问题吗?我是 Java 编码新手,无法编写简单的程序真的很痛苦。 public class
这里是 Stack Overflow 的第一个定时器! 首先,我正在使用 JavaFX 创建一个数独求解器。我一切正常,但是,我遇到的唯一问题是创建粗体 3x3 大块,每个大块内有 3x3 单元格。我
我的逻辑求解算法有问题。它很好地解决了具有大量提示的谜题,它只是解决了少于 45 条线索的谜题。 这是求解的算法。 Immutable 是一个 boolean 值,用于确定该值是否可以更改。 cell
我正在尝试使用 Python 线性优化库 Pulp 来解决 killer 数独问题。 https://en.wikipedia.org/wiki/Killer_sudoku 这是我迄今为止的尝试,添加
我是一名优秀的程序员,十分优秀!