- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对以下代码片段有疑问:它是一个数独求解器,通过填充空单元格来解决数独难题。我无法真正理解求解器方法背后的逻辑。为什么它在尝试 k=1-9 后返回 false 并在遍历所有单元格后返回 true 。我的想法是我们递归地进入 solver() 方法,一旦数独完成,它将返回 true 作为调用顺序,最后第一个调用的 solver() 将返回 true。我想我必须省略一些发生上述两个“返回”的场景。有人可以向我解释为什么这些“返回”应该存在吗?
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
char[][] board = {{'.', '2', '6', '5', '.', '.', '.', '9', '.'},
{'5', '.', '.', '.', '7', '9', '.', '.', '4'},
{'3', '.', '.', '.', '1', '.', '.', '.', '.'},
{'6', '.', '.', '.', '.', '.', '8', '.', '7'},
{'.', '7', '5', '.', '2', '.', '.', '1', '.'},
{'.', '1', '.', '.', '.', '.', '4', '.', '.'},
{'.', '.', '.', '3', '.', '8', '9', '.', '2'},
{'7', '.', '.', '.', '6', '.', '.', '4', '.'},
{'.', '3', '.', '2', '.', '.', '1', '.', '.'}};
s.solver(board);
}
public boolean solver(char[][] board) {
for (int r = 0; r < board.length; r++) {
for (int c = 0; c < board[0].length; c++) {
if (board[r][c] == '.') {
for (int k = 1; k <= 9; k++) {
board[r][c] = (char) ('0' + k);
if (isValid(board, r, c) && solver(board)) {
return true;
} else {
board[r][c] = '.';
}
}
return false;
}
}
}
return true;
}
public boolean isValid(char[][] board, int r, int c) {
//check row
boolean[] row = new boolean[9];
for (int i = 0; i < 9; i++) {
if (board[r][i] >= '1' && board[r][i] <= '9') {
if (row[board[r][i] - '1'] == false) {
row[board[r][i] - '1'] = true;
} else {
return false;
}
}
}
//check column
boolean[] col = new boolean[9];
for (int i = 0; i < 9; i++) {
if (board[i][c] >= '1' && board[i][c] <= '9') {
if (col[board[i][c] - '1'] == false) {
col[board[i][c] - '1'] = true;
} else {
return false;
}
}
}
//check the 3*3 grid
boolean[] grid = new boolean[9];
for (int i = (r / 3) * 3; i < (r / 3) * 3 + 3; i++) {
for (int j = (c / 3) * 3; j < (c / 3) * 3 + 3; j++) {
if (board[i][j] >= '1' && board[i][j] <= '9') {
if (grid[board[i][j] - '1'] == false) {
grid[board[i][j] - '1'] = true;
} else {
return false;
}
}
}
}
return true;
}
}
最佳答案
每个递归调用都会处理第一个 '.'还是要处理的。这将暂时用一个数字代替。如果更改成功(不会使电路板无效),请递归(将尝试下一个“.”)。如果失败,撤消本地所做的更改并返回 false,因为在此搜索分支上尝试的任何数字都是无效的。这意味着强制调用者(直到 root)尝试下一个选择。
关于java - Sudoku Solver的代码解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182546/
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
是否有算法或方法可以获得数独游戏的初始状态数独谜题。最好具有不同难度级别的能力? 最佳答案 基本上有两种方法。两者都需要 2 solvers ,一个类人求解器,它使用人类可执行的策略和回溯求解器。 使
我正在尝试准备数独项目。我现在有行和列控件。 如果我创建数组,则9 * 9程序在运行时崩溃,并且窗体窗口冻结。我通过单击“停止调试”按钮来停止它。但它与一小部分阵列完美配合。例如3 * 3。如果我创建
我仍在研究我的数独解算器,但又一次遇到了一些麻烦。我已经让数独解算器开始工作,但是每当我尝试解决一个真正“困难”的数独板时,我的解算器都会告诉我没有可能的解决方案,因为堆栈溢出错误。是的,我知道这些董
我正在尝试解决数独作为家庭作业的约束满足问题。我已经为特定行和列中的所有元素构造了不同的约束。我正在尝试为子区域中的元素构造不同的约束,但我遇到了一些麻烦。 我当前算法背后的总体思路是将子区域(例如
我对以下代码片段有疑问:它是一个数独求解器,通过填充空单元格来解决数独难题。我无法真正理解求解器方法背后的逻辑。为什么它在尝试 k=1-9 后返回 false 并在遍历所有单元格后返回 true 。我
【LeetCode】36. Valid Sudoku 解题报告(Python) 题目地址:https://leetcode.com/problems/valid-sudoku/description
是否有任何算法可以解决任何传统的数独难题,而无需猜测? 这里的 Guessing 是指尝试一个候选人,看看它走多远,如果发现与猜测矛盾,则回溯到猜测步骤并尝试另一个候选人;当所有候选人都用尽但没有成功
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 12 个月前关闭。 Improve
我用c语言做了一个数独解算器,我的递归函数只适用于第一行而不是停止。它查找第一个值为 0 的元素并填充它,然后查找下一个值,并用另一个解决方案填充它。在它解决第一行后停止,我将如何启用 canSolv
我正在编写一个数独游戏,每个单元格由一个 JTextField 表示,总共有 81 个 JTextField 对象。这种安排让我想知道如何有效地清除拼图。 现在我有这个: void clear() {
我正在开发一个 Java 程序,用于检查数独谜题是否已解决。我已经完成了水平和垂直数字检查部分。但是当尝试检查方 block 时,我无能为力。这是我的检查系统的工作原理。 这就是我想做的。希望有人提供
我必须创建一个程序,将数独的 9 行显示为 9 个 9 位数字,然后提示用户对数独执行 6 种操作之一。然后我们必须在用户每次执行操作时输出数独。这是应该如何进行的示例运行: Welcome to S
所以我更新了我的代码,但我仍然对如何检查已完成的数独板中的 3x3 block 以查看它是否没有任何重复数字感到困惑。这是我更新的方法。 static boolean isBlock1Valid(in
您好,我正在开发数独检查器,它可以验证已完成的板的解决方案是否正确。我目前对如何在 block 内进行检查感到困惑。现在我有一个 boolean 值如下我正在检查左上角的 block (Block1)
http://home.earthlink.net/~benfranq/Sudoku.html 也许有人可以告诉我为什么它在 Internet Explorer 中不起作用 在其他浏览器中,它似乎工作
锁定。这个问题及其答案是 locked 因为这个问题是题外话但具有历史意义。它目前不接受新的答案或互动。 介绍 一个有效的数独网格由数字 1 到 9 填充,在每个 9 的子 block 、行或列中没
我正在尝试用 Java 创建一个数独求解器,总的来说,我对编程和 Java 都是新手。我真的不知道如何处理这种错误。我不断收到堆栈溢出错误。 我尝试了不同的代码,但没有一个有效,但无论如何,这是我最新
我回答说我会有一个二维数组。 然后我会有3个函数 一个检查水平状态。 另一个检查垂直状态的函数 另一个检查 3*3 block 条件。 但是他不满意,有谁能很好的回答这个问题吗? 我发现这个堆栈溢出链
# include int check(int a,int b); int check1(int a,int b,int c,int d); void recursive(int x,int pos
我是一名优秀的程序员,十分优秀!