读书人

【开源】圆满破解九宫格(数独)游戏

发布时间: 2012-07-31 12:33:46 作者: rapoo

【开源】完美破解九宫格(数独)游戏
最近2年很少来社区活动,昨天机缘巧合写了个破解数独的程序,特拿来与大家分享,以示存在。

思路:
1、从第一个空格开始,计算出所有可能填充的数字,拿出第一个进行填充,将剩下的可能数字记录下来;
2、接着计算下一个空格所有可能的数字(在前边填充上的基础上),拿出第一个可能进行填充,将剩下的记录;
3、以此下去;
4、直到出现这样一个空格:所有的数字都没法填充(有冲突),就回到最后一次那个假设点,重新尝试其它的可能数字;
5、以此下去;
6、直到填充完所有空格。

附上核心代码
填充空格

C# code
        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        }

获取当前位置可能的数字
C# code
        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;            }        }


完整版:http://blog.csdn.net/sq_zhuyi/article/details/7717324




[解决办法]
先放入中间数,再开始计算 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已经不行了么?

读书人网 >C#

热点推荐