go编程解数独

gs272 · · 5066 次点击
你有没有写过八后同盘的‘树结构查找’算法,和那个差不多 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语言 的我可以发给你 另外 ,你的代码怎么贴的那么漂亮
#11
更多评论
polaris
社区,需要你我一同完善!
没玩过数独……
#1
不好意思,写错了,应该是下面的 007000001 900000628 602000590 000081005 070503000 090060070 000005000 200040086 040030000
#2