我编了个程序解数独题,试了很多题都能解出来,但碰到一道题解不了,好像是内存耗用太多之类的原因,其实感觉不应该会计算太多的。我想问下有没有人用go写过啊?帮解下这道题,如果能解出来,那就是我的代码有问题了,到时贴代码出来给大家看看。
000700001
900000628
602000590
000081005
070503000
090060070
000005000
200040086
040030000
0代表需要空白。 其实很怪,我将第一个填上5,马上就能解出来。 希望哪位帮解下。
有疑问加站长微信联系(非本文作者)

没玩过数独……
还是贴代码吧,真看不懂
呵呵,我已经找到问题所在了,解决了,等我把代码整理下就贴出来!
贴代码了,呵呵,水平有限,比较乱,但有个问题,我这个程序只能读出一组答案,怎么才能读出成立的所有答案啊!
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0
结束 成功解答,共计算了 10041 次! 8 1 2 7 5 3 6 4 9
9 4 3 6 8 2 1 7 5
6 7 5 4 9 1 2 8 3
1 5 4 2 3 7 8 9 6
3 6 9 8 4 5 7 2 1
2 8 7 1 6 9 5 3 4
5 2 1 9 7 4 3 6 8
4 3 8 5 2 6 9 1 7
7 9 6 3 1 8 4 5 2
未修改源码
能说下你期望的结果吗?
800000000000000000000000000000000000000000000000000000000000000000000000000000000
假如数独题如上,那肯定不止一种结果,我期望的是能得出所有成立的结果!
我用C语言写的解得挺快的(go正在学习中)。我接的结果是这样,需要的话我可以把代码贴出来:
*****************************************************
+-----------------+-----------------+-----------------+
| --- --- --- | --- --- --- | --- --- --- |
| | 5 | 8 | 7 | | | 9 | 2 | 6 | | | 4 | 3 | 1 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 9 | 1 | 4 | | | 3 | 5 | 7 | | | 6 | 2 | 8 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 6 | 3 | 2 | | | 8 | 1 | 4 | | | 5 | 9 | 7 | |
| --- --- --- | --- --- --- | --- --- --- |
+-----------------+-----------------+-----------------+
| --- --- --- | --- --- --- | --- --- --- |
| | 3 | 2 | 6 | | | 7 | 8 | 1 | | | 9 | 4 | 5 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 4 | 7 | 8 | | | 5 | 9 | 3 | | | 1 | 6 | 2 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 1 | 9 | 5 | | | 4 | 6 | 2 | | | 8 | 7 | 3 | |
| --- --- --- | --- --- --- | --- --- --- |
+-----------------+-----------------+-----------------+
| --- --- --- | --- --- --- | --- --- --- |
| | 8 | 6 | 9 | | | 2 | 7 | 5 | | | 3 | 1 | 4 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 2 | 5 | 3 | | | 1 | 4 | 9 | | | 7 | 8 | 6 | |
| --- --- --- | --- --- --- | --- --- --- |
| | 7 | 4 | 1 | | | 6 | 3 | 8 | | | 2 | 5 | 9 | |
| --- --- --- | --- --- --- | --- --- --- |
+-----------------+-----------------+-----------------+
(本来在输出的格式还挺整齐的,粘到这里好像变形了)
我的意思是怎么输出所有正确的结果! 比如
800000000000000000000000000000000000000000000000000000000000000000000000000000000
这个求解,最终结果肯定不只一种,怎么输出所有可能的结果。需要一个思路
你有没有写过八后同盘的‘树结构查找’算法,和那个差不多
定义一个点的结构体 type point struct{ x int; y int };
2.定义一个 长度为81的‘point’数组 记录填写的顺序;
3.定义一个二维数组 area[int][int] 该数组记录“按照以上填写顺序每个格里可以填写的数值”
值就应该是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{
}
可能我描述的不够准确,有空我把 C语言的程序改成golang的粘出来,如果你想要 C语言 的我可以发给你
你有没有写过八后同盘的‘树结构查找’算法,和那个差不多
定义一个点的结构体 type point struct{ x int; y int };
2.定义一个 长度为81的‘point’数组 记录填写的顺序;
3.定义一个二维数组 area[int][int] 该数组记录“按照以上填写顺序每个格里可以填写的数值”
值就应该是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{
}
可能我描述的不够准确,有空我把 C语言的程序改成golang的粘出来,如果你想要 C语言 的我可以发给你
另外 ,你的代码怎么贴的那么漂亮
<p>//你看看是不是要这样的效果,可以求所有的解</p>
<p>package main</p>
<p>import "fmt"</p>
<p>const (</p> N = 9 <p>)</p>
<p>type point struct{</p>
<pre><code>x int
y int </code></pre>
<p>}</p>
<p>type line [N]int</p>
<p>type area [N]line</p>
<p>func (s *area) show(){</p>
<pre><code>fmt.Println("---------------")
for i:=0;i<N;i++ { for j:=0;j<N;j++ { fmt.Print(s[i][j]) } fmt.Print("\n") } </code></pre>
<p>}</p>
<p>func main(){</p>
<pre><code>fmt.Println("")
var ( i int j int start int step int total int current point ) var sudoku area = area{ / {0,0,7,0,0,0,0,0,1}, {9,0,0,0,0,0,6,2,8}, {6,0,2,0,0,0,5,9,0}, {0,0,0,0,8,1,0,0,5}, {0,7,0,5,0,3,0,0,0}, {0,9,0,0,6,0,0,7,0}, {0,0,0,0,0,5,0,0,0}, {2,0,0,0,4,0,0,8,6}, {0,4,0,0,3,0,0,0,0}, /// {0,0,0,0,0,0,0,0,1}, {9,0,0,0,0,0,6,2,8}, {6,0,2,0,0,0,5,9,0}, {0,0,0,0,8,1,0,0,5}, {0,7,0,5,0,3,0,0,0}, {0,9,0,0,6,0,0,7,0}, {0,0,0,0,0,5,0,0,0}, {2,0,0,0,4,0,0,8,6}, {0,4,0,0,3,0,0,0,0}, } var limit area = area{} var route [NN]point = [NN]point{}
sdk := sudoku[:] i = 0 j = 0 route[0].x, route[0].y = i, j
var cover func([]line,point) int = func(sudo []line,p point) int {
}
// 确定填写路线 step,start = 0,0 for i=0; i<N; i++ { for j=0; j<N; j++{ if sudoku[i][j] > 0 { route[step].x,route[step].y = i,j step++ } } } start = step for i=0; i<N; i++ { for j=0; j<N; j++{ if !(sudoku[i][j] > 0) { route[step].x,route[step].y = i,j step++ } } }
//for _,a := range route { //fmt.Print(a) //}
// 初始化求解参数 current = route[start] limit[current.x][current.y] = cover(sdk,current) flag := '+' temp := sudoku[current.x][current.y] depth := start total = 0 for{ //fmt.Printf("%c,%d",flag,depth) switch flag {
}
fmt.Println("------------------OVER--------------------") fmt.Println("total:",total) </code></pre>
<p>}</p>
gist.github.com
15楼整解代码我放在这里了
非常感谢!我好好研究先!