赞
踩
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
如有多解,输出一个解
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
-
- #解题想法:首先九宫格判断规则,横、竖、宫格内数字不重复,所以有三种判断方法,取交集看共享的是否
- 为一个,是一个就填写,但由于存在多解(且此时交集为两个元素),故增加试错机制,当发现零点个数没有
- 发生变化,便进行试验,并记录当前节点状态,后面如果发现零点的三种判断方法没有交集,便恢复状态,
- 并确认另外一个值是正确的
-
-
-
- import sys
- def heng(i, j, ll):
- n = []
- for m in range(0, 9):
- if ll[i][m] != 0:
- n.append(ll[i][m])
- return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
- def shu(i, j, ll):
- n = []
- for m in range(0, 9):
- if ll[m][j] != 0:
- n.append(ll[m][j])
- return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
- def gong(i, j, ll):
- m1 = i // 3
- m2 = j // 3
- n = []
- for a in range(m1 * 3, m1 * 3 + 3):
- for b in range(m2 * 3, m2 * 3 + 3):
- if ll[a][b] != 0 :
- n.append(ll[a][b])
- return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
- if __name__ == "__main__":
-
- # ll = [
- # [0, 0, 8, 7, 1, 9, 2, 4, 5],
- # [9, 0, 5, 2, 3, 4, 0, 8, 6],
- # [0, 7, 4, 8, 0, 6, 1, 0, 3],
- # [7, 0, 3, 0, 9, 2, 0, 0, 0],
- # [5, 0, 0, 0, 0, 0, 0, 0, 0],
- # [8, 6, 1, 4, 0, 3, 5, 2, 9],
- # [4, 0, 0, 0, 2, 0, 0, 0, 8],
- # [0, 0, 0, 0, 0, 0, 0, 7, 0],
- # [1, 0, 7, 0, 6, 8, 0, 5, 0],
- # ]
-
- while True:
- isCon = True
- ll = []
- for i in range(9):
- tp = sys.stdin.readline().strip()
- if not tp:
- isCon = False
- break
- tp =[int(i) for i in tp.split(' ')]
- ll.append(tp)
- if isCon ==False:
- break
- dd=[]
- q=0
- r=0
- w=0
- for i in range(0, 9):
- for j in range(0, 9):
- if ll[i][j] == 0:
- dd.append([i,j])
- while len(dd)>0 :
- ko = len(dd)
- for r in dd:
- res = []
- i=r[0]
- j=r[1]
- h1 = heng(i, j, ll)
- s1 = shu(i, j, ll)
- g1 = gong(i, j, ll)
- for o in h1:
- if o in s1 and o in g1:
- res.append(o)
- if len(res) ==0:
- dd=dl
- ll[q][r]=w
- dd.remove([i, j])
- continue
- if len(res) == 1:
- ll[i][j] = res[0]
- dd.remove([i,j])
- else:
- continue
- if ko== len(dd):
- res = []
- i = dd[0][0]
- j = dd[0][1]
- h1 = heng(i, j, ll)
- s1 = shu(i, j, ll)
- g1 = gong(i, j, ll)
- for o in h1:
- if o in s1 and o in g1:
- res.append(o)
- ll[i][j] = res[0]
- dl = dd.copy()
- q=i
- r=j
- w=res[1]
- dd.remove([i, j])
-
- for x in ll:
- x=list(map(str,x))
- y=" ".join(x)
- print(y)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。