当前位置:   article > 正文

华为OD机试题:数独_华为机试数独题

华为机试数独题

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

如有多解,输出一个解


输入描述:

输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。

输出描述:

输出九行,每行九个空格隔开的数字,为解出的答案。
  1. #解题想法:首先九宫格判断规则,横、竖、宫格内数字不重复,所以有三种判断方法,取交集看共享的是否
  2. 为一个,是一个就填写,但由于存在多解(且此时交集为两个元素),故增加试错机制,当发现零点个数没有
  3. 发生变化,便进行试验,并记录当前节点状态,后面如果发现零点的三种判断方法没有交集,便恢复状态,
  4. 并确认另外一个值是正确的
  5. import sys
  6. def heng(i, j, ll):
  7. n = []
  8. for m in range(0, 9):
  9. if ll[i][m] != 0:
  10. n.append(ll[i][m])
  11. return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
  12. def shu(i, j, ll):
  13. n = []
  14. for m in range(0, 9):
  15. if ll[m][j] != 0:
  16. n.append(ll[m][j])
  17. return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
  18. def gong(i, j, ll):
  19. m1 = i // 3
  20. m2 = j // 3
  21. n = []
  22. for a in range(m1 * 3, m1 * 3 + 3):
  23. for b in range(m2 * 3, m2 * 3 + 3):
  24. if ll[a][b] != 0 :
  25. n.append(ll[a][b])
  26. return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n))
  27. if __name__ == "__main__":
  28. # ll = [
  29. # [0, 0, 8, 7, 1, 9, 2, 4, 5],
  30. # [9, 0, 5, 2, 3, 4, 0, 8, 6],
  31. # [0, 7, 4, 8, 0, 6, 1, 0, 3],
  32. # [7, 0, 3, 0, 9, 2, 0, 0, 0],
  33. # [5, 0, 0, 0, 0, 0, 0, 0, 0],
  34. # [8, 6, 1, 4, 0, 3, 5, 2, 9],
  35. # [4, 0, 0, 0, 2, 0, 0, 0, 8],
  36. # [0, 0, 0, 0, 0, 0, 0, 7, 0],
  37. # [1, 0, 7, 0, 6, 8, 0, 5, 0],
  38. # ]
  39. while True:
  40. isCon = True
  41. ll = []
  42. for i in range(9):
  43. tp = sys.stdin.readline().strip()
  44. if not tp:
  45. isCon = False
  46. break
  47. tp =[int(i) for i in tp.split(' ')]
  48. ll.append(tp)
  49. if isCon ==False:
  50. break
  51. dd=[]
  52. q=0
  53. r=0
  54. w=0
  55. for i in range(0, 9):
  56. for j in range(0, 9):
  57. if ll[i][j] == 0:
  58. dd.append([i,j])
  59. while len(dd)>0 :
  60. ko = len(dd)
  61. for r in dd:
  62. res = []
  63. i=r[0]
  64. j=r[1]
  65. h1 = heng(i, j, ll)
  66. s1 = shu(i, j, ll)
  67. g1 = gong(i, j, ll)
  68. for o in h1:
  69. if o in s1 and o in g1:
  70. res.append(o)
  71. if len(res) ==0:
  72. dd=dl
  73. ll[q][r]=w
  74. dd.remove([i, j])
  75. continue
  76. if len(res) == 1:
  77. ll[i][j] = res[0]
  78. dd.remove([i,j])
  79. else:
  80. continue
  81. if ko== len(dd):
  82. res = []
  83. i = dd[0][0]
  84. j = dd[0][1]
  85. h1 = heng(i, j, ll)
  86. s1 = shu(i, j, ll)
  87. g1 = gong(i, j, ll)
  88. for o in h1:
  89. if o in s1 and o in g1:
  90. res.append(o)
  91. ll[i][j] = res[0]
  92. dl = dd.copy()
  93. q=i
  94. r=j
  95. w=res[1]
  96. dd.remove([i, j])
  97. for x in ll:
  98. x=list(map(str,x))
  99. y=" ".join(x)
  100. print(y)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/434291
推荐阅读
相关标签
  

闽ICP备14008679号