Просмотр исходного кода

improve performance by indexing the number of bricks on the board

Eren Yilmaz 6 лет назад
Родитель
Сommit
776b701513
1 измененных файлов с 13 добавлено и 8 удалено
  1. 13 8
      python/solve.py

+ 13 - 8
python/solve.py

@@ -14,10 +14,13 @@ class Solver:
         self.board_size = board_size
         self.steps = 1
         self.starting_state = ChessState(board_size=board_size)
-        self.states = [self.starting_state]
+        max_steps = (board_size * board_size - 1) // 3
+        self.states = [[] for _ in range(max_steps + 1)]
+        self.states[0].append(self.starting_state)
 
     def solvable(self, state):
-        current_id = len(self.states) - 1
+        bricks_on_field = len(state.history())
+        current_id = (bricks_on_field, len(self.states[bricks_on_field]) - 1)
 
         x, y = state.next_move()
         if x is None:
@@ -31,9 +34,9 @@ class Solver:
                 found_symmetry = -1
 
                 # look for symmetry
-                for i, b in enumerate(self.states):
+                for i, b in enumerate(self.states[bricks_on_field + 1]):
                     if next_state.symmetric_to(b):
-                        print(f'found symmetry between states {current_id} and {i}')
+                        print(f'found symmetry between states {current_id} and {(bricks_on_field, i)}')
                         found_symmetry = i
                         break
 
@@ -45,8 +48,9 @@ class Solver:
                     continue
 
                 # pace next brick
-                self.states.append(next_state)
-                next_id = len(self.states) - 1
+                bricks_on_field += 1
+                self.states[bricks_on_field].append(next_state)
+                next_id = (bricks_on_field, len(self.states[bricks_on_field]) - 1)
                 proof.edge(state_id(current_id),
                            state_id(next_id),
                            label=f'put next brick facing {direction} at {(x,y)}')
@@ -57,11 +61,12 @@ class Solver:
                     return True
         return False
 
+
 if __name__ == '__main__':
-    s = Solver()
+    s = Solver(board_size=14)
     proof.node(name=state_id(0), label=s.starting_state.board_label())
     result = s.solvable(s.starting_state)
     print('solvable:', result)
     print('steps:', s.steps)
     print('states:', len(s.states))
-    # proof.render(f'img/proof.gv', view=False)
+    proof.render(f'img/proof.gv', view=False)