问题标签 [sudoku]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
412 浏览

java - 算术运算使 0、1 和 2 返回 0 | 3、4 和 5 返回 1 等

我正在尝试采用 9x9、12x12、15x15 等数组,并让程序将它们解释为多个 3x3 正方形。

例如:

会被理解为:

在哪里:

.

我可以使用row % 3andcolumn % 3来确定框中的行和列值,但是如何确定数组中的给定值存储在哪个框中?

该公式可用于如下方法。

这似乎是可能的,我一直在努力解决这个问题。也许我让一个简单的问题变得太难了?

非常感谢您的帮助!

  • 贾斯蒂安
0 投票
6 回答
10908 浏览

java - 为数独求解器构建 GUI(完整的 ASCII 示例)

.

概览,示例

大家好,

我创建了一个基本的数独求解器,可以相当快地解决大多数问题。我还有很多工作要做,才能解决最困难的问题,但我想先尝试实现一个基本的 JFrame GUI。

我过去曾使用过互联网小程序,但以前从未使用过 JFrames。

我想创建类似于下图的东西(对于初学者):

.

细节

: 左拼图

  • 应明确定义 9x9 部分(中间的线;单独的框)
  • 文本框应该只接受数字/只允许输入一个数字(如果可能)

: 正确的谜题

  • 应明确定义 9x9 部分(中间的线;单独的框)
  • 只要框可以显示结果,是否可以/不能编辑框都没关系

: 按钮在中心

  • 应该运行 [SudokuPuzzle].solve();

: 底部文本框

  • 不应该是可编辑的

.

我在寻找什么

我从过去的经验中知道,这都可以在 JFrame 中完成,但是因为我自己从未构建过一个,所以我不太确定我需要使用哪些组件(内容项、面板、设置等)来满足我的规范. 我还没有找到一种方法来将我的文本框限制为数字并防止用户一次插入多个值。文本框真的是最好的选择,还是我错过了更能满足我需求的东西?

我不仅需要知道我需要哪些类,还需要知道如何组织这些类,以使按钮舒适地位于两个谜题之间,并且文本框位于下方。根据我的阅读MigLayout似乎是简化此过程的一种选择。

.

尾注

非常感谢任何提供帮助的人。如果这个问题的任何部分显得有些粗鲁或生硬,我深表歉意。我倾向于在晚上发布我的大部分问题,因此在我尝试所有回复之前,社区有几个小时的时间来仔细考虑(这以及我大部分时间都在外面做事情的事实)。

我会再醒 1-2 个小时来回答任何问题。

再次感谢,

贾斯蒂安

0 投票
1 回答
1436 浏览

sudoku - 在哪里可以得到 C++ 中的数独生成器?

这是一个 - http://ostermiller.org/qqwing/ 但有时我的 PHP 代码 (shell_exec('qqwing..')) 死了,在 syslog 中我可以找到 qqwing 的段错误。

所以,我正在寻找更好的发电机,但找不到。快速和难度级别。

有什么建议么?

0 投票
3 回答
6002 浏览

c# - 用于创建数独板的蛮力算法

我正在开发的是最初整个数独板是空的。其中一个随机单元格(81 个)填充了随机值(1-9)。

现在我想使用蛮力方法填充所有剩余的单元格。
谷歌搜索后我了解到,我们应该从第一个单元格开始并用 1 填充它(如果它有效),然后用 2 填充第二个单元格(如果它有效,我们将开始检查一个大于最后填充的单元格,在本例中为 1,一旦达到 9,我们将其重置为 1)。

问题是它不能正常工作!

任何人都可以将我链接到确切的算法。

0 投票
3 回答
1018 浏览

c++ - 数独求解器由于某种原因一直卡住

所以我不得不为高中的计算机项目编写一个程序,我想到了做一个 sudoko 求解器。“解决”算法是这样实现的:-

  1. 对于只有一个元素“适合”查看行、列、3x3 集的任何点,请输入该数字。重复执行此操作,直到无法再完成为止。这可以在“singleLeft”函数中看到。
  2. 如果某个数字“适合”某个点,但在相关行、列或 3x3 集合中没有其他位置,则将该数字放入。这可以在“checkOnlyAllowed”函数中看到。
  3. 如果我们还没有完成,做一个“猜测”——取一些“适合”的数字,把它放在那里,然后使用这个算法(递归)再次求解——如果它有效,我们就完成了。

到目前为止,我有这个代码:

(包括行号的代码:http ://sprunge.us/AiUc?cpp )

现在我知道它不是很好的风格,但它来自深夜的编码会议,而且我们在学校实验室使用了一个较旧的编译器,所以我不得不做一些不同的事情(在那个编译器中,标准头文件具有 '.h' 扩展名,在 for 循环中声明的变量在 for 范围外,...)。

该文件应包含棋盘中每个点的空格分隔数字,从左上角开始,从左到右,从上到下,空白点用“0”表示。

对于以下文件,它工作得相当好:

但是,这给它带来了麻烦:

如果我注释掉打印语句并跟踪进度,我可以看到它开始于在点上朝着错误的方向前进。最终它被卡在了最后,并且回溯永远不会足够远。我认为'checkOnlyAllowed'部分有问题......

你认为可能是什么问题?

另外 - 我知道我可以为“允许”表使用位域,但我们在学校还没有正式了解按位运算。:P

0 投票
3 回答
761 浏览

programming-languages - 识别编程语言

请识别此编程语言:

输出:

我在这个博客评论中找到了代码。

0 投票
3 回答
9644 浏览

java - Java问题中的蛮力数独求解器算法

除了求解方法之外,算法中的一切似乎都运行良好。当它使用可解数独板执行程序时,它说它无法解出。我已经尝试了解决方法中我能想到的一切。我尝试过调试,但在测试第一行后它失败了。有什么建议么?这是到目前为止的完整代码:

} System.out.print("|"); System.out.println(); } System.out.println("+---+---+---+"); }

if (grid[r][c] == 0) { System.out.print(' '); } else { System.out.print(grid[r][c]); } } public static int getEmptyCells(int[][] grid, int[][] emptyCells) { int i = 0; int numEmptyCells = 0; for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[r].length; c++) { if (grid[r][c] == 0) { emptyCells[i][0] = r; emptyCells[i][1] = c; numEmptyCells++; i++; } } } return numEmptyCells; }

private static boolean hasNoDuplicates(int[] digitsList) { for (int j = 0; j < digitsList.length; j++) { for (int k = j + 1; k < digitsList.length; k++) { if (digitsList[j] == digitsList[k] && digitsList[j] != 0) return false; } } return true; }

private static boolean checkCurrentRow(int[][] grid, int currentRow) {
int[] digitsList = new int[grid.length]; for (int c = 0; c < digitsList.length; c++) { digitsList[c] = grid[currentRow][c]; } if (hasNoDuplicates(digitsList)) { return true; } return false; }

private static boolean checkCurrentCol(int[][] grid, int currentCol) { int[] digitsList = new int[grid.length]; for (int i = 0; i < digitsList.length; i++) { digitsList[i] = grid[i][currentCol]; } if (hasNoDuplicates(digitsList)) { return true; } return false; }

private static boolean checkCurrentRegion(int[][] grid, int currentRow, int currentCol) {
int[] digitsList = new int[grid.length]; currentRow = (currentRow / 3) * 3; currentCol = (currentCol / 3) * 3; int i = 0; for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) { digitsList[i] = grid[currentRow + r][currentCol + c]; i++; } } if (hasNoDuplicates(digitsList)) { return true; } return false; }

public static boolean isConsistent(int[][] grid, int currentRow, int currentCol) { if (checkCurrentRow(grid, currentRow) && checkCurrentCol(grid, currentCol) && checkCurrentRegion(grid, currentRow, currentCol)) { return true; } return false; }

public static boolean solvePuzzle(int[][] grid, int[][] emptyCells, int numEmptyCells) { int i = 0; int j = 0; int currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]]; while (j < numEmptyCells) { if (currentCellDigit != 9) { currentCellDigit++; grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit; if (isConsistent(grid, emptyCells[i][0], emptyCells[i][1])) { grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit; i++; j++; } else { grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit - 1; } } else { currentCellDigit = 0; currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]]; i--; j--; if (j < 0) { return false; } } }

return true;
}

public static void main(String[] args) {

final int SIZE = 9; int[][] puzzle = { {0,2,9,0,0,3,0,0,5}, {5,0,7,0,0,0,0,9,0}, {6,0,0,0,0,9,4,2,0}, {3,0,2,0,0,4,0,0,0}, {0,0,5,0,3,0,7,0,0}, {0,0,0,5,0,0,6,0,2}, {0,9,8,4,0,0,0,0,3}, {0,3,0,0,0,0,1,0,6}, {2,0,0,3,0,0,9,4,0} };

int[][] grid = new int[SIZE][SIZE]; int[][] emptyCellsList = new int[SIZE*SIZE][2]; int numEmptyCells = 0;

initializeGrid(grid, puzzle); numEmptyCells = getEmptyCells(grid, emptyCellsList); System.out.println("The puzzle:"); displayGrid(puzzle); if (solvePuzzle(grid, emptyCellsList, numEmptyCells)) { System.out.println("has been solved:"); displayGrid(grid); } else { System.out.println("cannot be solved!"); } } }
0 投票
4 回答
7545 浏览

python - 表示数独谜题的正确数据结构?

用来表示数独谜题的智能数据结构是什么?即一个 9X9 正方形,其中每个“单元格”包含一个数字或一个空白。

特殊考虑包括:

  • 能够跨行、列和在 3X3“组中进行比较
  • 易于实现(特别是在 Python 中)
  • 效率(不是最重要的)

我想在紧要关头,二维数组可能会起作用,但这似乎不是一个优雅的解决方案。我只是想知道是否有更好的数据结构。

0 投票
3 回答
3968 浏览

java - JFormattedTextField 未正确清除

我正在做这个任务,做一个解决数独的程序。我有一个带有 SudokuTextBox 网格的面板扩展了 JFormattedTextField。我有一个 MaskFormatter,因此每个文本框只接受一个整数。然后在我的面板中,当一个键被释放时,我有这个代码。

问题是,如果我在文本框中输入了一个有效值,然后我返回并输入一个无效值(根据数独规则),文本框就会被清除。但是,当我向前选项卡时,前一个有效值会显示在文本框中。我的 sudokumatrix 包含所有已输入的数字,确实清除了应有的值,因此它仅在相应的文本框中。

当我将“SudokuTextBox 扩展 JFormattedTextField”更改为“SudokuTextBox 扩展 JTextField”时,事情变得更加混乱,它就像一个魅力。但是我无法将 JTextField 的大小设置为正方形,并且我不能对每个文本框强制执行一个整数。

我错过了一些非常明显的东西吗?

0 投票
2 回答
1960 浏览

java - 帮助使用二维数组的 Java Sudoku Permuter 程序?

我必须创建一个程序,将 9 行数独显示为 9 个 9 位数字,然后提示用户在数独上执行 6 个操作之一。然后我们必须在用户每次执行操作时输出数独。这是应该如何进行的示例运行:

假设用户输入 3(交换两个行面板)。这会出现:

它将交换行面板 1 和 3,这将是输出:

假设用户输入 5。这出现了:

原来的数独再次输出,除了 2's 和 8's 在整个过程中切换。

如果用户输入 1,就会出现一些提示

并且无论用户输入哪一行,这两个单独的行将被交换并且数独将再次被输出。如果用户输入 2,则类似,但会切换 2 列。类似地,如果用户输入 4,则会切换两个列面板。

我们应该使用这样的二维数组:

我不知道该怎么做。我整个学期都在苦苦挣扎,这是我的第一堂编程课。我只是根本不懂数组,我也不明白我们一开始应该如何显示数独。这个问题不在我们的书中,所以我也没有什么可回顾的。我真的需要通过这门课。如果有人可以帮助我,我真的很感激。尽量让它易于理解,有很多东西我还没有学会如何去做(例如:为了记录,idk parseInt 是什么)。我试过读这本书(好几次)。它可以帮助一些人,但是这个程序是不可能的。十分感谢你的帮助。