数独逻辑解算器

时间:2014-06-24 01:35:44

标签: java algorithm sudoku

由于缺乏信息而导致我的上一个问题here被锁定,我现在会尝试进一步解释,以消除混淆。

好的,先左看一下我正在做的事情的背景信息 我开始创建一个数独游戏的个人项目来学习面向对象编程,ArrayLists,算法,模型/控制/设计层,并且通常扩展我的知识编程。
我已经走了很远的路来制作这个游戏并且它已接近完成但是我遇到了一个我需要帮助解决的小问题。

当我生成3个sudokus,一个简单,一个中等和一个硬盘时,我遇到了问题 容易和中等难度的sudokus是可以解决的,但难以解决的数据难以解决。

工作原理:
首先我有一个算法使用随机数生成和验证生成一个有效的数独板,然后我通过另一个算法传递它通过9x9板上的所有数字并以百分之几的机会删除它们,这个百分比机会在调用时指定方法,例如50%的机会轻松删除数字,65%的机会很难。

我的问题:
好的,我的问题是我在“硬”难度下生成了数据,发现它无法解决。现在我没有验证方法来检查这个谜题是否可以以任何方式解决,所以如果它可以解决的话,那么长篇大论就是偶然的。

我需要什么:
我需要一种算法或方法来验证谜题是否可解,因为它现在是因为随机数移除机会我只能随机解决它。这不应该使用蛮力(回溯)来完成,而是应该看看谜题并决定哪些数字去哪里,基本上就像你和我解决它一样。通过这种方式,我不仅可以验证它是否具有单一解决方案,而且还可以验证您是否可以解决它。

变量的小图形视图以及类的连接方式:

Class diagram

使用上面的例子直观表示数独的结构:

Sudoku representation

数独中的1到9个数字是单元格1到9。

如果您需要有关该计划的更多详细信息,请告诉我,我会将其添加到此表单中,我只是尽量保持简短,同时仍尝试涵盖与此问题相关的所有内容。

4 个答案:

答案 0 :(得分:1)

我将尝试明确或隐含地回答您提出的问题:

"首先我有一个使用随机数生成和验证的算法来生成有效数独板"

如果您的算法确实生成了有效数独游戏板,那么它应该是可解决的。如果这不是你所说的可解决的请详细说明。

&#34;我需要一种算法或方法来验证这个谜题是否可以解决,因为它现在只是因为随机数移除机会我只能随机解决它。&#34; < / p>

任何解决Sudoku的算法都会验证它确实可以解决。删除任何数字可能会使游戏难以解决并可能增加有效解决方案的数量,从而使其无效(请参阅Serge Ballesta的机智评论)。我还想提一下:&#34;数独谜题一般被分类为简单,中等或难度,谜题一般有更多的起始线索,但并不总是更容易解决。但是在数学上量化难度很难。&#34;。见Mathematics of Sudoku Leads To "Richter Scale" of Puzzle Hardness

&#34;这不应该使用蛮力(回溯)来完成,而是应该看看谜题并决定哪些数字去哪里,基本上就像你和我会解决它一样。&#34; < / p>

您正在寻求一种模拟人类行为并思考解决此问题的算法。我不认为这是一个可行的要求,可能会落入人工智能的研究领域。人类解决诸如Sudoku之类的难题的思路因人而异。初学者可能会遵循类似于深度优先搜索和回溯的方法。处理难以解决的问题不是人类最有效的方法。在国际象棋等游戏中,这根本不是一种可持续的方法。专家们倾向于通过对董事会的全球观点来认识模式。我很确定专家数独人类玩家遵循类似的过程。见How experts recall chess positions

答案 1 :(得分:0)

你需要做的第一部分是非程序化的:你必须找到一个详尽的(有点......)解决方法列表。然后只需依次应用它们,直到你解决谜题并宣布可以通过你的程序解决或者保持卡住并决定拒绝它。

但这还不够。如果您能找到解决方案,则仍需要通过强力验证此解决方案是唯一的。如果不这样做,您可以生成具有多个解决方案的拼图,并且大多数玩家都宣布这些解决方案无效。

拒绝通过你的方法无法解决的有效谜题并不重要,因为没有人会注意到它们(只要你不让用户输入他们自己的谜题)。

答案 2 :(得分:0)

我认为Tarik在答案中说的是什么。

我能想到的可能算法(这只是想法,不是最优的,但可以改进):

第一部分 - 直截了当地解决:

  • 1)为每个空单元格列表分配要插入的可能数字(基于数独规则)。
  • 2)迭代每个空单元格并检查要插入的可能数字列表是否只包含一个元素。

如果只包含一个可能的插入号码,则插入此号码并重复步骤(1)。 如果您无法插入更多数字,请转到第二部分。

第二部分 - 分支:

  • 3)根据要插入的可能数字的数量(从第一部分)按升序迭代每个空单元格。
  • 4)这是递归。对于填写给定单元格的每个可能的数字创建单独的数独板并尝试从步骤(1)开始以相同的方式解决它

这种递归方法(深度优先搜索)将允许您找到所有可能的解决方案。

这是提高编程技能的良好练习:)

答案 3 :(得分:0)

如果您正在寻找解决数独游戏的逻辑算法,那么这将有所帮助:

http://hodoku.sourceforge.net/en/techniques.php

http://diuf.unifr.ch/pai/people/juillera/Sudoku/Sudoku.html