九宫格数独游戏C语言解法

标签:
九宫格解法 |
分类: 每周一C |
最近几天深圳一直下雨,一个人闷在屋里很是无聊,偶然打开一个小游戏网站看到了我的最爱——九宫格数独游戏。共有1-5五个难度级别,像我这种资深玩家其他难度就不用考虑了,冲着难度5的题目就去了,结果做地汗流浃背也知道过了多长时间还是没解出来,很是受伤啊!题目如下:
http://s11/middle/9e16dc4dg795296eb377a&690
这道题靠一般的方法是很难解出来的,最有效也是最复杂的办法是假设-推断-假设......,但是仅凭人的记忆力和计算速度花费的时间是很长的,所以我打算用C语言编写一个程序以求解所有的九宫格数独游戏。下面分析下算法的结构:每个九宫格数独游戏包含了9个九宫格单元,编号如下:
http://s2/middle/9e16dc4dgbd3a0caaa821&690
每个九宫格单元有9个数字位,编号如下:
http://s4/middle/9e16dc4dg79529d465be3&690
解题思路如下,第0个九宫格缺少数字1、2、6、7、8、9,空缺的数字位为1、2、3、5、6、9,首先看数字1,从数字位1开始查找可以插入的数字位,由于第一列有1,所以不能放在数字位1,再看数字位2可以放下,则将数字1插入九宫格单元0的数字位2,接着按照同样的方式将数字2、6、7、8插入相应的数字位,如下图所示:
http://s3/middle/9e16dc4dgbd3a3e773c62&690
下面该插入数字9,此时只剩一个数字位9,但是由于该列已经有数字9,所以数字9是不能插入数字位9的,则将数字8放入下一个数字位,如下图所示:
http://s2/middle/9e16dc4dgbd3a4e0aa691&690
此时只剩数字位6,显然数字9仍然不能插入该数字位,同时数字8也没有其他的可变换数字位,则将数字8擦除,变化数字7到下一个数字位,同时插入数字8到第一个可以插入的数字位,如下:
http://s6/middle/9e16dc4dgbd3a5a403085&690
可以发现数字9仍没有可以插入的数字位,接着擦除数字7和8,将7变换到下一个数字位....。重复以上步骤,直到将所有的数字填入,并且满足了九宫格的要求,结束并输出最终结果。
看到这里你应该也能看出,求解的过程其实就是一个栈结构。首先查找一个待插入的数字,如果该数字有可以插入的数字位,则将该数字、数字位以及在待插入矩阵的行与列位置压入栈;相反如果没有可插入的数字位,则将栈顶元素弹出,放入到待插入数据的首部,同时变化数字位到下一个位置,如此重复以上步骤直到满足结束条件。算法的流程图如下,其中省掉一些小部分,想了解更多可以参考最后给出的源文件。
http://s10/middle/9e16dc4dgf644981f3719&690
下面是对应的C源代码,只是草稿,还没来得及优化,仅供参考。
#include "stdio.h"
//定义栈的最大长度
#define MAXSTACKLENGTH 81
//待求解的九宫格矩阵,空白位置用0表示
int jiuGongArray[][9]={{0,0,0,0,4,0,0,3,2},
//空缺数据组成的矩阵,共有九个九宫格单元,从左到右,然后从上到下编号为0-8;
//例如:第一个九宫格单元空缺的数字为1,4,8,则矩阵dataNeedToBeInsert的第一行
//为{1,0,0,4,0,0,0,8,0}
int dataNeedToBeInsert[][9]={{1,2,3,4,5,6,7,8,9},