摇摆游戏攻略网

关闭导航
首页 > 棋牌益智 > 游戏攻略2

数独问题高级数独没有更快捷的解答方式吗

整理:yaobaiwang.com 时间:09月19日

[数独可以计算吗]数独游戏的来历:与填字游戏不同的是,玩“数独”游戏无需掌握任何一门特定的语言。事实上,从技术的角度来说,你甚至连数数都不用会。所有要做的就是将1到9这9个数字按一定秩序填...+阅读

数独问题高级数独没有更快捷的解答方式吗

计算机算法简介

本文所讨论的算法是一种通用算法,虽然不能说是最快的算法,但却可以解所有的数独游戏。

算法准备:

1、一个可能性:表示某个格子可能填写的数字。

2、可能性数目:表示某个格子可能性的数量。为0表示已经确定。

3、区域标志:表示某个格子所在区域(小九宫)的ID,所有区域标志都是预定义的。

4、确定数量:表示所有数字已经确定的格子的数量,为81时则表示已经找到解。

5、整个九宫格用三个矩阵表示:可能性矩阵,数目矩阵,区域标志矩阵

算法的基本思想:

步骤1、将所有未确定的格子的可能性定义为0xFFFF(即所有数字都可能),可能数目为9。

步骤2、寻找所有确定的格子A(可能数目为0),在所有与A同行、同列和同区域的未确定的格子的可能性中减去与A相同的可能性。例如:A确定为9,则与A同行、同列和同区域(区域标志相同)的未确定的格子的可能性与0xFEFF按位与(除去可能性9),并将其可能性数目减少。

在除去可能性的过程中如果发现某个格子B的可能性数目由1减小为0,说明B和A只能取相同的数字,这可能是题目本身无解引起,也肯能是由于步骤3中搜索方向不对引起的,可认为此方向的搜索无解,退出这一方向的搜索。定义这个检查为唯一性检查。

步骤3、寻找所有未确定格子中可能性数目最少的格子M,如果M的可能性数目为1,则确定M:将M的可能性数目定义为0,并把确定数量加1,如果此时确定数量达到81,则报告找到解,否则,在所有与M同行、同列和同区域的未确定的格子的可能性中减去与M相同的可能性,并进行唯一性检查。然后重复步骤3。

如果M的可能性大于1,则把M假设为所有M的可能性,分多个方向进行搜索,在每一个搜索方向重复步骤3(这个可以用递归来实现)。

算法性能

本算法可以在50毫秒以内解任意有解的数独游戏。

我想用vb做个数独的随机数组帮忙看看错在哪里了

你的思路有些问题。我对你的代码做了较大的修改。

1、到某一个数据的时候,1~9这9个数据已经被同列或者同行占用完了,这时候就要推倒重头再来,否则,只是返回到bb,只能是死循环。

2、检测与同列、同行是否数据相同都是单循环,不要做无意义的双循环。

3、总体上,这样用随机的布置数据,有时很快。但更多的药做几百次才能成。

4、我写代码的时候,text(2)~text(80)是用代码生成的。0和1是绘制的。Dim 重来次数 As IntegerPrivate Sub Command1_Click() Dim 当前文本框序号 As Integer Dim 未占用(1 To 9) As Boolean Randomize死了重来: 重来次数 = 重来次数 + 1 Label1 = "已经做了" & 重来次数 & "次" 清空 If 重来次数 >1000 Then MsgBox "我都做了1000次,还是不得成。让我先歇一会。" End End If For i = 0 To 8 For j = 0 To 8 '先检查,本行和本列是否占完了所有数值!!!! For m = 1 To 9 未占用(m) = True Next m For m = 0 To i - 1 '先标本列 未占用(Int(Text(m * 9 + j))) = False Next m For m = 0 To j - 1 '再标本行 未占用(Int(Text(i * 9 + m))) = False Next m For m = 1 To 9 If 未占用(m) Then Exit For '有空数字,从这里出,m9 Then GoTo 死了重来 当前文本框序号 = i * 9 + j '注意,这里是乘以9,而不是乘以8!!!有重复: Text(当前文本框序号).Text = Int(Rnd * 9 + 1) For m = 0 To i - 1 '列归列,不扯其他 If Text(当前文本框序号) = Text(m * 9 + j) Then GoTo 有重复 '不与本列已有数据相同 Next m For m = 0 To j - 1 '行归行,不扯其他 If Text(当前文本框序号) = Text(i * 9 + m) Then GoTo 有重复 '不与本行已有数据相同 Next m Next j Next i MsgBox "天哪,终于做好了。下回可别再让我做这样的事了。"End SubPrivate Sub 清空() For i = 0 To 80 Text(i) = "" Next iEnd SubPrivate Sub Form_Load() Me.Height = 5000 Me.Width = 5000 Label1.Left = Width - 500 - TextWidth("已经做了 1000 次") Label1 = "" Command1.Left = 500 For i = 0 To 80 If i >1 Then Load Text(i) Text(i).Visible = True Text(i).Move (i Mod 9) * 500 + 100, (i \ 9) * 300 + 1000, 400, 200 Next i Command1.Caption = "开始" 清空End Sub

以下为关联内容:

数独的解法有什么手法吗数独技巧解?数独游戏是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9*9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-...

数独的答案唯一吗数独答案不是唯一的,也有多解题。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已带陆扮知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。...

数独大神给解答步骤不是答案是步骤谢谢数独游戏笔算该怎么做:答案如图过程:首先在H7格中填入2(试填)G7格中填3(对G行应用隐性唯一候选7a64e4b893e5b19e31333363366137数法)G1格填9(接下来对G4、G5、G6单元格应用候选数区...

点样更容易玩好数独怎样玩数独:1.联除法. 在并排的三个九宫格中的两排寻找相同数字,再利用九宫格得出另一排中该数字位置,该方法适用于中高级数独. 2.巡格法 找出在每个九宫格中出现频率较高的数...

数独81宫格数独口诀81宫格数独 8715 78 548617 39 58 96 51:如图: 每个人的习惯不一样,每个人的思维方法,惯性也不一样,根据自己的长处选择最好的办法才是真正的技巧。联除法 巡格法找出在每个九宫...

大神解答这是数独么sudoku数独高手进:你 聪明格 我和你说下规则:每行每列1,2,3,4不重复,运用加减乘除, 如8+,就是这框内的几个数字相加的和为8,看到这个数字,只能是1+3+4=8 所以,你这题的一行一列肯定...

数独可以集中注意力吗什么叫数独?如何玩:可以的,但是效果不明显注意力的提升主要有一下几个方法1 双目聚精会神法。先盯住一个物体(可以是一个点、一本书、自己的手指、屋外的电线杆等等)5分钟。然后...

QQ寻仙关于数独的问题数独真的很难吗:数独一共有四种难度 数独一至数独4 要玩数独所先要用风水图把它添加到休闲游戏去 数独给的经验是根据玩家等级给的(我现在54级玩一次数独四有7000多经验) 每种...

数独怎么玩数独游戏的基本解法数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫...

推荐文章