|
@@ -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
|
|
|
|
|
|
|
|
|
- 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
|
|
|
|
|
|
|
|
|
- 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)
|