Tag: sudoku

解决数独的递归方法

我目前正在学习我的第二个java编程课程,并且我需要完成一项通过该课程的作业有问题。 基本上它是关于编写一个程序,递归地解决数据与回溯。 这是我提出的算法。 我使用了一个9×9数组来表示网格,该网格在开头用零填充。 checkFill检查是否可以将数字(var)插入位置[i] [j]。 问题是它只解决了数据,它总是返回false(没有解决方案),有些单元格仍然包含零。 我在这做错了什么? import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Sudoku { private int[][] sudoku; private JFrame frame; private JFormattedTextField[][] sudokuSquares; private JButton solve, clear; public Sudoku() { sudoku = new int[9][9]; frame = new JFrame(“Sudoku Solver”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel northPanel = new JPanel(); northPanel.setLayout(new GridLayout(9, 9)); northPanel.setBorder(BorderFactory.createEmptyBorder(10, […]

具有反向跟踪的数独求解算法

我正在寻求实现一个非常简单的算法,该算法使用powershell反向跟踪来解决数独网格。 我面临的问题是,在我的实现中,我为一个名为row和col的Sudoku类包含了两个实例变量,它们对应于表示Sudoku网格的二维数组中的空单元格的行和列。 当我的solve()方法执行时,它首先检查是否没有任何空单元格,在这种情况下拼图已经完成。 否则,同一方法将空单元格的行和列分配给包含网格的Sudoku对象的实例变量row和col 。 之后,for循环通过方法调用isSafe(int n)validation可以在该空单元格中放置哪个数字(此方法检查是否满足拼图的约束,我可以保证它完美地运行)。 因此, isSafe()方法在空单元格中放置一个数字,然后在Sudoku对象上再次对solve()方法进行递归调用。 如果我们遇到了无法满足的约束,那么我们将0重新分配给最后row和col 。 这就是问题所在! 由于程序不断更新row和col变量,因此每次递归调用都会丢失旧实例。 我一直在试图弄清楚如何存储这些值,以便程序可以在回溯时撤消操作。 我想把每个col和row推到一个堆栈,但我真的不知道该去哪里。 有人能告诉我解决这个问题的简单方法是什么? 我不包括整个课程,如果你觉得它有用,请告诉我,我会发布。 class Sudoku { int SIZE, N, row, col; int Grid[][]; public boolean solve() { if (!this.findNextZero()) return true; for (int num = 1; num <= 9; num++) { if (isSafe(num)) { this.Grid[this.row][this.col] = num; if (this.solve()) return true; […]

确定数独是否具有唯一解决方案

我正在努力使用回溯算法来确定数独有一个独特的解决方案,或者它是否有多个解决方案。 这是我使用的回溯代码: static boolean solve(int i, int j, int[][] cells) { if (i == 9) { i = 0; if (++j == 9) return true; } if (cells[i][j] != 0) // skip filled cells return solve(i+1,j,cells); for (int val = 1; val <= 9; ++val) { if (legal(i,j,val,cells)) { cells[i][j] = val; if (solve(i+1,j,cells)) return […]

数独求解器的算法复杂度(Big-O)

我正在寻找“你如何找到它”,因为我不知道如何找到我的程序的算法复杂性。 我用java编写了一个数独求解器,没有效率的想法(我想尝试让它递归工作,我成功了!) 一些背景: 我的策略采用回溯来确定,对于给定的数独谜题,谜题是否只有一个独特的解决方案。 所以我基本上阅读了一个给定的谜题并解决它。 一旦我找到了一个解决方案,我不一定完成,需要继续探索进一步的解决方案。 最后,三种可能的结果之一发生:难题根本无法解决,拼图有独特的解决方案,或者拼图有多种解决方案。 我的程序从一个文件中读取拼图坐标,该文件对于每个给定的数字有一行,包括行,列和数字。 根据我自己的惯例,7的左上方标记为007。 执行: 我从文件中加载值,并将它们存储在一个二维数组中,我沿着数组向下直到找到一个空白(未填充的值),然后将其设置为1.并检查是否有任何冲突(值是否为i输入有效或无效)。 如果是,我转到下一个值。 如果不是,我将值递增1,直到找到一个有效的数字,或者如果它们都不起作用(1到9),我返回1步到我调整的最后一个值,然后递增该值(使用递归)。 当所有81个元素都被填满时,我完成了解决,没有冲突。 如果找到任何解决方案,我将它们打印到终端。 否则,如果我尝试在我最初修改的FIRST元素上“返回一步”,则表示没有解决方案。 我的程序如何算法复杂度? 我以为它可能是线性的[O(n)],但我多次访问该数组,所以我不确定:( 任何帮助表示赞赏

为Sudoku解算器构建GUI(使用ASCII示例完成)

。 概述,样本 大家好, 我已经创建了一个基本的数独求解器,可以很快地解决大多数问题。 我仍然需要做很多工作才能解决最困难的问题,但我想首先尝试实现一个基本的JFrame GUI。 我过去曾使用过互联网小程序,但从未使用过JFrame。 我想创建类似于下图的内容(对于初学者): ————————————————————————————————- ! Sudoku Solver 1.0 – [] X ! ————————————————————————————————- ! _____________ _____________ _____________ _____________ _____________ _____________ ! ! | _ _ _ | _ _ _ | _ _ _ | | _ _ _ | _ _ _ | _ _ _ | ! ! […]

为什么翻译的数独求解器比原来慢?

我将Java Sudoku解算器转录为python。 一切正常,但解决需要2分钟,而相同的拼图只需要几秒钟的Java。 此外,所需的迭代数量完全相同。 我错过了什么吗? import numpy as np def solve_recursive(puzzle, pos): if(pos == 81): print puzzle return True if(puzzle[pos] != 0): if (not solve_recursive(puzzle, pos+1)): return False else: return True row = np.copy(puzzle[pos//9*9:pos//9*9+9]) col = np.copy(puzzle[pos%9::9]) short = (pos%9)//3*3 + pos//27*27 square = np.concatenate((puzzle[short:short+3],puzzle[short+9:short+12],puzzle[short+18:short+21])) for i in range(1,10): puzzle[pos] = i if(i not in […]

Java中的数独求解器,使用回溯和递归

我正在用Java编写一个用于9×9网格的数独求解器。 我有方法: 打印网格 用给定的值初始化电路板 测试冲突(如果相同的数字在同一行或3×3子网格中) 一种逐个放置数字的方法,这需要最多的工作。 在我详细介绍该方法之前,请记住我必须使用递归来解决它,以及回溯(在这里观看applet作为示例http://www.heimetli.ch/ffh/simplifiedsudoku.html ) 另外,我通过垂直向下移动来解决这个数独,从左上角开始,到第一列,然后到第二列,等等。 到目前为止,我有以下内容: public boolean placeNumber(int column){ if (column == SUDOKU_SIZE){ // we have went through all the columns, game is over return true; } else { int row=0; //takes you to the top of the row each time while (row < SUDOKU_SIZE) loops through the column downwards, […]