【发布时间】:2016-08-09 16:48:10
【问题描述】:
我正在开发一个程序,该程序使用数独板的正确值填充一个空的 9x9 数组。我的验证方法有效,因为我已经在一个简单的迭代回溯方法中对其进行了测试。 我目前的做法是随机选择一行和一列并放置一个适当的值,我也在通过使用递归来实现回溯。这是我的求解器函数:
void solve (int board[9][9]) {
static int counter = 0;
int val = 0;
int row = 0;
int col = 0;
if (counter == 81) {
print (board, counter);
exit(1);
}
while (1) {
row = rand() % 9;
col = rand() % 9;
if (board[row][col] == 0)
break;
}
++counter;
for (int i = 1; i < 10; i++) {
val = i;
if (ok (board, row, col, val)) {
board[row][col] = val;
solve (board);
}
}
--counter;
}
现在我遇到的问题是我从来没有达到 81,我的函数在此之前终止,我假设堆栈变空并返回到 main。你能帮我理解我犯了什么错误吗?谢谢你。
【问题讨论】:
-
@user4581301 谢谢你,就像一个白痴一样,每次插入值时我都会打印出板子,并用它来查看问题所在。我现在一定要使用它。
-
This 可能会有所帮助。我做到了。
-
void solve (int board[9][9]) {在技术上类似于solve(int **),因此每次调用都会给出指针,每个solve在同一块板上工作,因此您必须自己清理它(就像 Nelxost 指出的那样)。在对象编程中,一种可能的设计是创建板作为求解器类的成员变量,求解器在其上运行(不是每次都用相同的指针填充堆栈)。代码风格的更多注释:for (int i = 1; i < 10; i++)- 我会使用i <= 9来遵循人类逻辑:“尝试从 1 到 9 的数字”。将i重命名为val并删除val(使用较少的堆栈)。 -
@Ped7g 感谢您对清理代码的建议,非常感谢。嗯,所以 board 作为成员变量背后的想法是,由于该类只会被实例化一次,因此对该类的成员的每次调用只会发生一次,而不是多次?
标签: c++