7得票4回答
构建一个高效的数独求解器

是的,我知道这并不新鲜,已经有很多问题了(它甚至有自己的标签),但我想单独使用Java创建数独求解器,目的是训练自己编写更高效代码的能力。 在程序中完成这个任务最简单的方法可能是使用大量的循环遍历每一列和每一行,收集每个单元格的可能值,然后排除只有一个可能性的单元格(无论它们是否只包含一个数...

8得票1回答
判断JavaScript中数独是否可解

这是一个来自Pramp的问题。我需要确定数独是否可解(不像LEETcode问题,我只需要确定一个棋盘是否有效)。 以下是我的JavaScript代码,使用递归。我遵循了Pramp建议的逻辑,创建了一个helper函数getCandidates()来查找所有可以放入空格的候选数。然后在实际的s...

13得票4回答
如何在Java中重复使用线程?

我正在构建一个控制台数独求解器,主要目标是提高速度。 现在我有一个ManagerThread,它启动WorkerThreads来计算每个单元格的邻居。因此,当前为每个单元格启动了一个WorkerThread。如何重用已完成工作的现有线程? 线程池模式似乎是解决方案,但我不知道该如何防止线程...

7得票3回答
数独 - 基于行、列找到当前方格

根据上述图片中的坐标,我想计算所选单元格属于哪个以红色突出显示的“方格”。 我正在解决数独难题,并可以访问每个方格的宽度,以及单元格所在的行/列。 我无法计算单元格所属的“数字”方格(它们从左到右,从上到下开始为1,递增),因此上面方格的数字为: 1|2 3|4 我该如何计算这个呢...

7得票2回答
生成最小/不可约数独游戏

一个数独谜题是最小的(也称为不可约)当且仅当它有唯一的解,但是移除任何数字都会产生一个有多个解的谜题。换句话说,每个数字都是必要的来确定解决方案。 我有一个生成最小数独的基本算法: - 生成一个完成的谜题。 - 以随机顺序访问每个单元格。对于每个访问的单元格: - 暂时删除其数字 - 使...

18得票9回答
优化数独回溯算法的方法

我希望优化我的数独求解器的回溯算法。 目前的做法是: 递归求解函数以一个数独谜题及其各种已知的值为输入。 遍历谜题中所有的空格,寻找拥有最少可能值的位置,并获得该位置的值列表。 从值列表中取出一个值放入该位置,然后递归求解,直到整个谜题被填满。 然而,对于某些谜题来说,这种实现仍然非...

7得票2回答
确定数独是否有唯一解

我正在努力研究一种回溯算法,以确定数独是否具有唯一的解决方案,或者它是否具有多个解决方案。以下是我使用的回溯代码: static boolean solve(int i, int j, int[][] cells) { if (i == 9) { i = 0;...

25得票6回答
Java中的数独求解程序,采用回溯和递归算法

我正在使用Java编写一个9x9网格的数独求解器。 我有以下方法: 打印网格 用给定的值初始化棋盘 检测冲突(如果相同的数字在同一行或3x3子网格中) 一个逐个放置数字的方法,这需要最多的工作。 在详细讨论该方法之前,请记住我必须使用递归来解决问题,以及回溯(请参考此处的应用程序ht...

14得票4回答
有没有任何算法可以解决任何传统数独谜题,而不需要猜测(或类似的技巧)?

是否有任何算法可以在不猜测的情况下解决任何传统数独难题? 这里的“猜测”指尝试一个候选数字,看它能填多远,如果发现矛盾,则回溯到猜测步骤并尝试另一个候选数字;当所有候选数字都用完了但没有成功时,则回溯到上一个猜测步骤(如果有的话;否则谜题证明无效),等等。 编辑1:感谢您的回复。 传统数...

33得票2回答
跳舞链接算法 - 一个更注重实现而不是解释的解释?

我一直在开发一个数独求解器,目前的求解器使用回溯算法,但是仍然需要太长时间。 我希望将其缩短至大多数情况下少于一秒。因此,我决定使用跳跃链接算法进行重写,了解它是一种更好的暴力方法,特别适用于像数独难题这样的约束问题。 我尝试阅读维基百科和Knuth's paper上关于它的介绍,但两者都...