|
1 | 1 | import numpy as np
|
| 2 | +from move import Move |
2 | 3 |
|
3 | 4 | class Sudoku:
|
4 | 5 |
|
5 |
| - def __init__(self) -> None: |
| 6 | + def __init__(self, grid: np.ndarray) -> None: |
6 | 7 |
|
7 |
| - self.grid = np.zeros((9,9)) |
| 8 | + self.grid = grid |
| 9 | + self.region1 = self.grid[:3, :3] |
| 10 | + self.region2 = self.grid[:3, 3:6] |
| 11 | + self.region3 = self.grid[:3, 6:9] |
| 12 | + self.region4 = self.grid[3:6, :3] |
| 13 | + self.region5 = self.grid[3:6, 3:6] |
| 14 | + self.region6 = self.grid[3:6, 6:9] |
| 15 | + self.region7 = self.grid[6:9, :3] |
| 16 | + self.region8 = self.grid[6:9, 3:6] |
| 17 | + self.region9 = self.grid[6:9, 6:9] |
8 | 18 |
|
9 |
| - def put_number(self, number, row, column) -> None: |
| 19 | + def put_number(self, move: Move) -> None: |
10 | 20 |
|
11 |
| - self.grid[row, column] = number |
| 21 | + self.grid[move.row, move.column] = move.number |
| 22 | + |
| 23 | + def check_legal_state(self, previous_move: Move) -> bool: |
| 24 | + |
| 25 | + row_to_check = self.grid[previous_move.row, :].copy() |
| 26 | + column_to_check = self.grid[:, previous_move.column].copy() |
| 27 | + region_to_check = self.get_region_from_move(previous_move) |
| 28 | + |
| 29 | + # Remove 0's from the areas to be checked |
| 30 | + |
| 31 | + row_to_check = row_to_check[row_to_check != 0] |
| 32 | + column_to_check = column_to_check[column_to_check != 0] |
| 33 | + region_to_check = region_to_check[region_to_check != 0] |
| 34 | + |
| 35 | + # Check if there are repeated numbers after the move |
| 36 | + |
| 37 | + row_check = np.unique(row_to_check).size == row_to_check.size |
| 38 | + column_check = np.unique(column_to_check).size == column_to_check.size |
| 39 | + region_check = np.unique(region_to_check).size == region_to_check.size |
| 40 | + |
| 41 | + return row_check and column_check and region_check |
| 42 | + |
| 43 | + def get_region_from_move(self, move: Move) -> np.ndarray : |
| 44 | + |
| 45 | + if move.row <= 2 and move.column <= 2: |
| 46 | + return self.region1 |
| 47 | + elif move.row <= 2 and move.column <= 5 and move.column > 2: |
| 48 | + return self.region2 |
| 49 | + elif move.row <= 2 and move.column <= 9 and move.column > 5: |
| 50 | + return self.region3 |
| 51 | + elif move.row <= 5 and move.row > 2 and move.column <= 2: |
| 52 | + return self.region4 |
| 53 | + elif move.row <= 5 and move.row > 2 and move.column <= 5 and move.column > 2: |
| 54 | + return self.region5 |
| 55 | + elif move.row <= 5 and move.row > 2 and move.column <= 9 and move.column > 5: |
| 56 | + return self.region6 |
| 57 | + elif move.row <= 9 and move.row > 5 and move.column <= 2: |
| 58 | + return self.region7 |
| 59 | + elif move.row <= 9 and move.row > 5 and move.column <= 5 and move.column > 2: |
| 60 | + return self.region8 |
| 61 | + else: |
| 62 | + return self.region9 |
0 commit comments