【开源】完美破解九宫格(数独)游戏
最近2年很少来社区活动,昨天机缘巧合写了个破解数独的程序,特拿来与大家分享,以示存在。
思路:
1、从第一个空格开始,计算出所有可能填充的数字,拿出第一个进行填充,将剩下的可能数字记录下来;
2、接着计算下一个空格所有可能的数字(在前边填充上的基础上),拿出第一个可能进行填充,将剩下的记录;
3、以此下去;
4、直到出现这样一个空格:所有的数字都没法填充(有冲突),就回到最后一次那个假设点,重新尝试其它的可能数字;
5、以此下去;
6、直到填充完所有空格。
附上核心代码
填充空格
private void FillArray() { for (int m = 0; m < 3; m++) { for (int n = 0; n < 3; n++) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (pArr[m][n][i][j].Default == false) {//空白格 var pv = GetNumber(new int[4] { m, n, i, j }); if (!pv.Ok) { m = pv.Position[0]; n = pv.Position[1]; i = pv.Position[2]; j = pv.Position[3]; ClearAfter(pv.Position); } pArr[m][n][i][j].Value = pv.Value; } } }//end small } }//end big }
private PosValues GetNumber(int[] pos) { List<int> nums = new List<int>(); for (int n = 1; n <= 9; n++) { nums.Add(n); } //3宫格内 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int a = pArr[pos[0]][pos[1]][i][j].Value; if (a > 0 && nums.Contains(a)) { nums.Remove(a); } } } //横向 for (int n = 0; n < 3; n++) { for (int j = 0; j < 3; j++) { int a = pArr[pos[0]][n][pos[2]][j].Value; if (a > 0 && nums.Contains(a)) { nums.Remove(a); } } } //纵向 for (int m = 0; m < 3; m++) { for (int i = 0; i < 3; i++) { int a = pArr[m][pos[1]][i][pos[3]].Value; if (a > 0 && nums.Contains(a)) { nums.Remove(a); } } } if (nums.Count == 0) { if (posVals.Count == 0) { return new PosValues() { Value = 0 }; } var pv = posVals[posVals.Count - 1]; pv.Ok = false; pv.Value = pv.Values[0]; pv.Values.Remove(pv.Value); if (pv.Values.Count == 0) { posVals.Remove(pv); } return pv; } else { var pv = new PosValues(); pv.Position = pos; pv.Value = nums[0]; nums.Remove(pv.Value); pv.Values = nums; if (nums.Count > 0) { posVals.Add(pv); } return pv; } }
[解决办法]
先放入中间数,再开始计算 4边 会不会更好呢。
[解决办法]
谢谢分享!
[解决办法]
之前在1个群里。讨论过 有没有 1种算法 可以 计算 无限宫格的呢?
好疑惑。. 顺便再膜拜下
[解决办法]
试试!!
[解决办法]
感谢分享~
[解决办法]
[解决办法]
感谢分享
[解决办法]
感谢分享
[解决办法]
这个方法怎么感觉像穷举一样呢 会不会很慢呢 不懂 瞎问的哈。。。
[解决办法]
谢谢分享!
[解决办法]
谢谢分享
[解决办法]
谢谢分享
[解决办法]
标记等会看.
[解决办法]
这样写是不是效率比较低!!
[解决办法]
谢谢分享!
[解决办法]
回溯而已。。
[解决办法]
感谢神灵呵!
[解决办法]
Java语言程序设计 基础篇 有这样的算法 而且做成了GUI
[解决办法]
算法很简单,不过谢谢分享了
[解决办法]
http://topic.csdn.net/u/20120508/01/1820787a-097b-4ef5-b98b-c646c926f225.html
linq版
[解决办法]
太棒了,有时间给我们讲讲
[解决办法]
谢谢分享
[解决办法]
这个办法并有点繁琐了,简单的办法其实百度上已经有了,以前我们解数独游戏也是手工的,套路已经很明显了,更本用不着可能性穷举。
[解决办法]
这个是回朔算法么? 不知道回朔是什么!!能简单说明1下么? 谢谢 新手学习
[解决办法]
难道现在数独比较流行么?
[解决办法]
难道现在数独比较流行么?
[解决办法]
不知道对于信息给的更少的数独,并且多解的情况怎么处理
正常情况一个宫内面缺2-4个,如果缺的更多会怎么样?
[解决办法]
感谢楼楼
[解决办法]
谢谢LZ分享 赶紧学习一下
[解决办法]
为什么现在C#这么流行?最近出来的都是C#的。。java已经不行了么?