当前位置:   article > 正文

最强大脑《数字迷途》算法及python代码

最强大脑《数字迷途》算法及python代码

问题描述:

将n*n数字棋盘空缺位置补齐,使得所有数字按顺序经过所有格子并连成一条曲线,相邻两点之间可通过上下左右和对角线共8种方式连接。

比如下面是试题题面:

 解决算法:

维护一个candidate集合,里面元素表示与当前题面上所存在数字相邻的数字。整体算法使用深度优先搜索,每次在candidate集合中取出一个元素,然后获取可放置位置,遍历有效位置进行递归求解。递归出口:candidate集合为空。

python代码:

  1. class Matrix:
  2. def __init__(self, grid):
  3. self.n = len(grid)
  4. self.grid = grid
  5. self.visited = [[0 for j in range(self.n)] for i in range(self.n)]
  6. self.number = {}
  7. self.candi = set()
  8. def build(self):
  9. for i in range(self.n):
  10. for j in range(self.n):
  11. if self.grid[i][j]!=0:
  12. self.number[self.grid[i][j]] = (i, j)
  13. self.visited[i][j] = 1
  14. for num in self.number:
  15. if num - 1 not in self.number and num!=1:
  16. self.candi.add(num-1)
  17. if num + 1 not in self.number and num!=self.n*self.n:
  18. self.candi.add(num+1)
  19. self.opts = [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, 1), (1, -1)]
  20. def run_model(self):
  21. self.build()
  22. f = self.solve()
  23. for i in range(1, self.n*self.n+1):
  24. x, y = self.number[i]
  25. self.grid[x][y] = i
  26. def get_candi_position(self, key):
  27. res = set()
  28. x, y = self.number[key]
  29. for op in self.opts:
  30. nx ,ny = x+op[0], y+op[1]
  31. if nx>=0 and nx<self.n and ny>=0 and ny<self.n and self.visited[nx][ny]==0:
  32. res.add((nx, ny))
  33. return res
  34. def solve(self):
  35. if not self.candi:
  36. return True
  37. item = list(self.candi)[-1]
  38. self.candi.remove(item)
  39. adj_position = set()
  40. nei1 = set()
  41. nei2 = set()
  42. if item + 1 in self.number:
  43. nei1 = self.get_candi_position(item+1)
  44. if item - 1 in self.number:
  45. nei2 = self.get_candi_position(item-1)
  46. if item + 1 in self.number and item - 1 in self.number:
  47. adj_position = nei1.intersection(nei2)
  48. elif item + 1 in self.number:
  49. adj_position = nei1
  50. elif item - 1 in self.number:
  51. adj_position = nei2
  52. for x, y in adj_position:
  53. self.number[item] = (x, y)
  54. self.visited[x][y] = 1
  55. n1 = False
  56. n2 = False
  57. if item + 1 not in self.number and item+1<=self.n*self.n:
  58. if item+1 not in self.candi:
  59. self.candi.add(item+1)
  60. n1 = True
  61. if item - 1 not in self.number and item-1>=1:
  62. if item-1 not in self.candi:
  63. self.candi.add(item-1)
  64. n2 = True
  65. if self.solve():
  66. return True
  67. del self.number[item]
  68. self.visited[x][y] = 0
  69. if n1:
  70. self.candi.remove(item+1)
  71. if n2:
  72. self.candi.remove(item-1)
  73. self.candi.add(item)
  74. return False
  75. def __str__(self):
  76. s = []
  77. for i in range(self.n):
  78. s_t = ""
  79. for j in range(self.n):
  80. s_t += "{:<5}".format(self.grid[i][j])
  81. s_t += "\n"
  82. s.append(s_t)
  83. return "\n".join(s)
  84. grid = [[35,36,0,0,0,49,0],[0,0,39,0,41,0,0],[30,0,0,27,0,0,46],[0,0,1,0,0,23,0],[0,4,0,0,24,0,0],[0,0,0,12,15,0,19],[7,8,0,0,0,0,18]]
  85. m = Matrix(grid)
  86. m.run_model()
  87. print(m)

运行结果:

在最强大脑app填入答案:

 

 成绩排在第9,时间2:19。时间主要消耗在输入输出题面。

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

闽ICP备14008679号