中级会员
  • 第 697 位会员
  • zhangtao
  • 1138922230@qq.com
  • 2013-09-03 09:10:02
  • Offline
  • 0

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 go编程解数独
    15楼整解[代码我放在这里了][1] [1]: https://gist.github.com/anonymous/6558230
  • 评论了主题 go编程解数独
    代码沾上去全乱了 , 你是怎么弄上去的 (建议将上面乱的删掉)
  • 评论了主题 go编程解数独
    代码沾上去全乱了 , 你是怎么弄上去的
  • 评论了主题 go编程解数独
    <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&lt;N;i++ { for j:=0;j&lt;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 [N*N]point = [N*N]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 { var ( x int y int i int j int result int ) result = 0 for i,j = p.x,0; j&lt;N; j++ { if p.y != j { result = result|(1&lt;&lt;uint(sudo[i][j])) } } for i,j = 0,p.y; i&lt;N; i++ { if p.x != i { result = result|(1&lt;&lt;uint(sudo[i][j])) } } x,y = (p.x/3)*3,(p.y/3)*3 for i=0;i&lt;3;i++ { for j=0;j&lt;3;j++ { if p.x != i &amp;&amp; p.y != j { result = result|(1&lt;&lt;uint(sudo[x+i][y+j])) } } } return result } // 确定填写路线 step,start = 0,0 for i=0; i&lt;N; i++ { for j=0; j&lt;N; j++{ if sudoku[i][j] &gt; 0 { route[step].x,route[step].y = i,j step++ } } } start = step for i=0; i&lt;N; i++ { for j=0; j&lt;N; j++{ if !(sudoku[i][j] &gt; 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 { case '&gt;': if depth &gt;= N*N { sudoku.show() depth-- flag = '&lt;' total++ }else{ temp = 0 current = route[depth] limit[current.x][current.y] = cover(sdk,current) flag = '+' } break case '&lt;': if depth &lt; start { break } else { current = route[depth] flag = '+' temp = sudoku[current.x][current.y] } default: temp++ if temp &gt; N { flag = '&lt;' sudoku[current.x][current.y] = 0 depth-- }else if (1&lt;&lt;uint(temp)|limit[current.x][current.y]) != limit[current.x][current.y] { flag = '&gt;' sudoku[current.x][current.y] = temp depth++ } } if depth &lt; start { // 查找完毕 break } } fmt.Println("------------------OVER--------------------") fmt.Println("total:",total) </code></pre> <p>}</p>
  • 评论了主题 go编程解数独
    你有没有写过八后同盘的‘树结构查找’算法,和那个差不多 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语言 的我可以发给你 另外 ,你的代码怎么贴的那么漂亮