当前位置:   article > 正文

最强大脑《数阵迷踪》python代码_最强大脑python游戏

最强大脑python游戏
  1. from collections import defaultdict
  2. from math import gcd
  3. class Vertex:
  4. def __init__(self, val, id):
  5. self.val = val
  6. self.id = id
  7. self.degree = 0
  8. class Edge:
  9. def __init__(self, v1, v2):
  10. self.v1 = v1
  11. self.v2 = v2
  12. def set_score(self, graph):
  13. self.score = graph.vertex_set[self.v1].degree + graph.vertex_set[self.v2].degree
  14. class Graph:
  15. def __init__(self, grid):
  16. self.n = len(grid)
  17. self.grid = grid
  18. self.vertex_set = {}
  19. self.edge_set = []
  20. self.edge_is_remove = []
  21. self.edge_visited = []
  22. def convert_edge_set(self):
  23. self.adj_map = defaultdict(list)
  24. for i in range(self.edge_num):
  25. if self.edge_is_remove[i] == 0:
  26. edge = self.edge_set[i]
  27. v1 = edge.v1
  28. v2 = edge.v2
  29. self.adj_map[v1].append(v2)
  30. self.adj_map[v2].append(v1)
  31. def query_linked(self, i, j, d=0):
  32. v1 = self.get_vertex_id(i, j)
  33. if d==0:
  34. v2 = self.get_vertex_id(i, j+1)
  35. else:
  36. v2 = self.get_vertex_id(i+1, j)
  37. return v2 in self.adj_map[v1]
  38. def get_vertex_id(self, i, j):
  39. id = i * self.n + j
  40. return id
  41. def build_graph(self):
  42. for i in range(self.n):
  43. for j in range(self.n):
  44. v1 = self.get_vertex_id(i, j)
  45. if v1 in self.vertex_set:
  46. ver1 = self.vertex_set[v1]
  47. else:
  48. ver1 = Vertex(self.grid[i][j], v1)
  49. self.vertex_set[v1] = ver1
  50. if j != self.n - 1:
  51. v2 = self.get_vertex_id(i, j+1)
  52. if v2 in self.vertex_set:
  53. ver2 = self.vertex_set[v2]
  54. else:
  55. ver2 = Vertex(self.grid[i][j+1], v2)
  56. self.vertex_set[v2] = ver2
  57. if gcd(ver1.val, ver2.val) > 1:
  58. e = Edge(v1, v2)
  59. self.edge_set.append(e)
  60. ver1.degree += 1
  61. ver2.degree += 1
  62. if i != self.n - 1:
  63. v2 = self.get_vertex_id(i+1, j)
  64. if v2 in self.vertex_set:
  65. ver2 = self.vertex_set[v2]
  66. else:
  67. ver2 = Vertex(self.grid[i+1][j], v2)
  68. self.vertex_set[v2] = ver2
  69. if gcd(ver1.val, ver2.val) > 1:
  70. e = Edge(v1, v2)
  71. self.edge_set.append(e)
  72. ver1.degree += 1
  73. ver2.degree += 1
  74. def rank_edge(self):
  75. for e in self.edge_set:
  76. e.set_score(self)
  77. self.edge_set.sort(key=lambda e: e.score)
  78. def dfs(self):
  79. self.rank_edge()
  80. self.edge_num = len(self.edge_set)
  81. self.edge_is_remove = [0 for i in range(self.edge_num)]
  82. self.current_degree = [0, 0, 0, 0, 0]
  83. for ver in self.vertex_set.values():
  84. d = ver.degree
  85. self.current_degree[d] += 1
  86. self.solve(0)
  87. def remove_edge(self, e):
  88. ver1, ver2 = self.vertex_set[e.v1], self.vertex_set[e.v2]
  89. self.current_degree[ver1.degree] -= 1
  90. self.current_degree[ver2.degree] -= 1
  91. self.current_degree[ver1.degree - 1] += 1
  92. self.current_degree[ver2.degree - 1] += 1
  93. ver1.degree -= 1
  94. ver2.degree -= 1
  95. def add_edge(self, e):
  96. ver1, ver2 = self.vertex_set[e.v1], self.vertex_set[e.v2]
  97. self.current_degree[ver1.degree] -= 1
  98. self.current_degree[ver2.degree] -= 1
  99. self.current_degree[ver1.degree + 1] += 1
  100. self.current_degree[ver2.degree + 1] += 1
  101. ver1.degree += 1
  102. ver2.degree += 1
  103. def is_connet(self):
  104. father = [i for i in range(self.n*self.n)]
  105. size = [1 for i in range(self.n*self.n)]
  106. def find(x):
  107. if father[x] != x:
  108. father[x] = find(father[x])
  109. return father[x]
  110. def union(v_1, v_2):
  111. f_v1 = find(v_1)
  112. f_v2 = find(v_2)
  113. if f_v1 != f_v2:
  114. if size[f_v1] >= size[f_v2]:
  115. father[f_v2] = f_v1
  116. size[f_v1] += size[f_v2]
  117. else:
  118. father[f_v1] = f_v2
  119. size[f_v2] += size[f_v1]
  120. for i in range(self.edge_num):
  121. if self.edge_is_remove[i] == 0:
  122. edge = self.edge_set[i]
  123. v1 = edge.v1
  124. v2 = edge.v2
  125. union(v1, v2)
  126. for i in range(self.n*self.n):
  127. if find(i) != father[0]:
  128. return False
  129. return True
  130. def solve(self, index):
  131. if self.current_degree[1] == 2 and self.current_degree[2] == self.n*self.n-2 and self.is_connet():
  132. return True
  133. if index == self.edge_num or self.current_degree[0] > 0 or self.current_degree[1] > 2:
  134. return False
  135. self.edge_is_remove[index] = 1
  136. self.remove_edge(self.edge_set[index])
  137. if self.solve(index + 1):
  138. return True
  139. self.edge_is_remove[index] = 0
  140. self.add_edge(self.edge_set[index])
  141. return self.solve(index + 1)
  142. class Matrix:
  143. def __init__(self, grid):
  144. self.n = len(grid)
  145. self.grid = grid
  146. self.graph = Graph(grid)
  147. def run_model(self):
  148. self.graph.build_graph()
  149. self.graph.dfs()
  150. self.graph.convert_edge_set()
  151. def __str__(self):
  152. s = []
  153. for i in range(self.n - 1):
  154. s_t_1 = ""
  155. s_t_2 = ""
  156. for j in range(self.n - 1):
  157. s_t_1 += "{:>03}".format(self.grid[i][j])
  158. if self.graph.query_linked(i, j, 0):
  159. s_t_1 += "——"
  160. else:
  161. s_t_1 += " "
  162. if self.graph.query_linked(i, j, 1):
  163. s_t_2 += "{:<5}".format(" |")
  164. else:
  165. s_t_2 += "{:<5}".format("")
  166. if self.graph.query_linked(i, self.n - 1, 1):
  167. s_t_2 += "{:<5}".format(" |")
  168. s_t_1 += "{:>03}".format(self.grid[i][self.n - 1])
  169. s.append(s_t_1)
  170. s.append(s_t_2)
  171. s_t = ""
  172. for j in range(self.n - 1):
  173. s_t += "{:>03}".format(self.grid[self.n - 1][j])
  174. if self.graph.query_linked(self.n - 1, j, 0):
  175. s_t += "——"
  176. else:
  177. s_t += " "
  178. s_t += "{:>03}".format(self.grid[self.n - 1][self.n - 1])
  179. s.append(s_t)
  180. res = "\n".join(s)
  181. return res
  182. grid = [[118,106,148,16,22], [177,159,111,188,24],\
  183. [21,42,171,133,10], [12,18,74,14,4],[26,54,57,66,8]]
  184. m = Matrix(grid)
  185. m.run_model()
  186. print(m)

代码备注:

采用回溯方式对每一条边进行删除或者保留,最终返回状态为两个度为1的顶点加n*n-2个度为2的顶点,并且图中不存在回路。

运行结果:

 

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

闽ICP备14008679号