|
1 | 1 | class TicTacToe {
|
2 | 2 |
|
3 |
| - /** Initialize your data structure here. */ |
4 |
| - int[][] board; |
5 |
| - Map<Integer, Map<Integer, Integer>> rowMap; |
6 |
| - Map<Integer, Map<Integer, Integer>> colMap; |
7 |
| - Map<Integer, Integer> leftDiagonalMap; |
8 |
| - Map<Integer, Integer> rightDiagonalMap; |
9 |
| - int n; |
| 3 | + private int n; |
| 4 | + private Map<Integer, Map<Integer, Integer>> rowMapping; |
| 5 | + private Map<Integer, Map<Integer, Integer>> colMapping; |
| 6 | + private Map<Integer, Map<Integer, Integer>> diagonalMapping; |
| 7 | + |
| 8 | + private final int LEFT_DIAGONAL = 1; |
| 9 | + private final int RIGHT_DIAGONAL = -1; |
| 10 | + |
10 | 11 | public TicTacToe(int n) {
|
11 |
| - board = new int[n][n]; |
12 |
| - rowMap = new HashMap<>(); |
13 |
| - colMap = new HashMap<>(); |
14 |
| - leftDiagonalMap = new HashMap<>(); |
15 |
| - rightDiagonalMap = new HashMap<>(); |
16 | 12 | this.n = n;
|
| 13 | + this.rowMapping = new HashMap<>(); |
| 14 | + this.colMapping = new HashMap<>(); |
| 15 | + this.diagonalMapping = new HashMap<>(); |
| 16 | + this.diagonalMapping.put(LEFT_DIAGONAL, new HashMap<>()); |
| 17 | + this.diagonalMapping.put(RIGHT_DIAGONAL, new HashMap<>()); |
17 | 18 | }
|
18 | 19 |
|
19 |
| - /** Player {player} makes a move at ({row}, {col}). |
20 |
| - @param row The row of the board. |
21 |
| - @param col The column of the board. |
22 |
| - @param player The player, can be either 1 or 2. |
23 |
| - @return The current winning condition, can be either: |
24 |
| - 0: No one wins. |
25 |
| - 1: Player 1 wins. |
26 |
| - 2: Player 2 wins. */ |
27 | 20 | public int move(int row, int col, int player) {
|
28 |
| - if (!rowMap.containsKey(row)) { |
29 |
| - Map<Integer, Integer> map = new HashMap<>(); |
30 |
| - rowMap.put(row, map); |
31 |
| - } |
32 |
| - rowMap.get(row).put(player, rowMap.get(row).getOrDefault(player, 0) + 1); |
33 |
| - if (ifWinner(rowMap.get(row), player)) { |
34 |
| - return player; |
35 |
| - } |
36 |
| - if (!colMap.containsKey(col)) { |
37 |
| - Map<Integer, Integer> map = new HashMap<>(); |
38 |
| - colMap.put(col, map); |
39 |
| - } |
40 |
| - colMap.get(col).put(player, colMap.get(col).getOrDefault(player, 0) + 1); |
41 |
| - if (ifWinner(colMap.get(col), player)) { |
42 |
| - return player; |
43 |
| - } |
44 |
| - if (row == col) { |
45 |
| - leftDiagonalMap.put(player, leftDiagonalMap.getOrDefault(player, 0) + 1); |
46 |
| - } |
47 |
| - if (ifWinner(leftDiagonalMap, player)) { |
48 |
| - return player; |
49 |
| - } |
50 |
| - if (row + col == n - 1) { |
51 |
| - rightDiagonalMap.put(player, rightDiagonalMap.getOrDefault(player, 0) + 1); |
52 |
| - } |
53 |
| - if (ifWinner(rightDiagonalMap, player)) { |
| 21 | + recordMove(row, col, player); |
| 22 | + if (isWinnerFound(row, col, player)) { |
54 | 23 | return player;
|
55 | 24 | }
|
56 | 25 | return 0;
|
57 | 26 | }
|
58 | 27 |
|
59 |
| - private boolean ifWinner(Map<Integer, Integer> map, int player) { |
60 |
| - if (map.size() > 1) { |
61 |
| - return false; |
| 28 | + private void recordMove(int row, int col, int player) { |
| 29 | + this.rowMapping.computeIfAbsent(row, k -> new HashMap<>()); |
| 30 | + this.colMapping.computeIfAbsent(col, k -> new HashMap<>()); |
| 31 | + this.rowMapping.get(row).put(player, this.rowMapping.get(row).getOrDefault(player, 0) + 1); |
| 32 | + this.colMapping.get(col).put(player, this.colMapping.get(col).getOrDefault(player, 0) + 1); |
| 33 | + if (row == col) { |
| 34 | + this.diagonalMapping.get(LEFT_DIAGONAL) |
| 35 | + .put(player, this.diagonalMapping.get(LEFT_DIAGONAL).getOrDefault(player, 0) + 1); |
| 36 | + } |
| 37 | + if (row + col + 1 == this.n) { |
| 38 | + this.diagonalMapping.get(RIGHT_DIAGONAL) |
| 39 | + .put(player, this.diagonalMapping.get(RIGHT_DIAGONAL).getOrDefault(player, 0) + 1); |
62 | 40 | }
|
63 |
| - return map.values().stream().reduce(0, Integer::sum) == n; |
| 41 | + } |
| 42 | + |
| 43 | + private boolean isWinnerFound(int row, int col, int player) { |
| 44 | + return this.rowMapping.get(row).get(player) == this.n || |
| 45 | + this.colMapping.get(col).get(player) == this.n || |
| 46 | + this.diagonalMapping.get(LEFT_DIAGONAL).getOrDefault(player, 0) == this.n || |
| 47 | + this.diagonalMapping.get(RIGHT_DIAGONAL).getOrDefault(player, 0) == this.n; |
64 | 48 | }
|
65 | 49 | }
|
66 | 50 |
|
|
0 commit comments