我编了个程序解数独题,试了很多题都能解出来,但碰到一道题解不了,好像是内存耗用太多之类的原因,其实感觉不应该会计算太多的。我想问下有没有人用go写过啊?帮解下这道题,如果能解出来,那就是我的代码有问题了,到时贴代码出来给大家看看。
000700001
900000628
602000590
000081005
070503000
090060070
000005000
200040086
040030000
0代表需要空白。
其实很怪,我将第一个填上5,马上就能解出来。
希望哪位帮解下。
你有没有写过八后同盘的‘树结构查找’算法,和那个差不多
1. 定义一个点的结构体 type point struct{ x int; y int };
2.定义一个 长度为81的‘point’数组 记录填写的顺序;
将这个数组表示依次填写81个方格内容的顺序,对比如:800000....可以是[0,0][0,1],[0,2]...[8,8], 080000000...0可以是[0,1],[0,0],[0,2][0,3]...[8,8]
3.定义一个二维数组 area[int][int] 该数组记录“按照以上填写顺序每个格里可以填写的数值”
这个数组里的值是随着求解的过程变化的 比如 如果 方格sudo[i][j]里 1,3,4,5,9 和几个数据都被占据 那么area[i][j] 的
值就应该是val = (1<<1) | (1<<3) | (1<<4) | (1<<5) | (1<<9) , 当填写到sudo[i][j]时 判断X(x>0&&x<10) 是否可以填写
可用表达式 (X | val != val) 来判断,如果为真表示可以填写
4.开始探索式求解 定义滚动变量 current := 0; 定义求解深度变量用来 表示已填写的个数 depth := initDepth; (初始化时的个数);
for{
switch{
case 向前:
if 当前填写深度 大于81 /*表示找到一个解*/ ,{
记录结果,循环转入 ‘case 向后’;
} else {
1,计算下一个填写方格的'可填写值'即 area[x][y] , 2.深度加1 ,3.进入'case 向下'
}
case 向后:
if 当前深度小于初始深度 {
求解完成
} else {
1, 深度减1, 2.返回到填写前一格的状态,3.转入'case 向下'
}
case 向下:
1.滚动变量 current++;
if current > 9 {
current = 0
转入'case 向后'
} else {
if current 可填写入当前 {
填写并转入'case 向前'
} else {
继续循环'case 向下'
}
}
}
if depth < initDepth {
结束
}
}
/////////////////////////////////////////////////////////////
可能我描述的不够准确,有空我把 C语言的程序改成golang的粘出来,如果你想要 C语言 的我可以发给你
#10
更多评论
不好意思,写错了,应该是下面的
007000001
900000628
602000590
000081005
070503000
090060070
000005000
200040086
040030000
#2