-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLeetcode Problem 348 Design Tic-Tac-Toe.txt
More file actions
116 lines (86 loc) · 3.27 KB
/
Leetcode Problem 348 Design Tic-Tac-Toe.txt
File metadata and controls
116 lines (86 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
348. Design Tic-Tac-Toe
Design a Tic-tac-toe game that is played between two players on a n x n grid.
You may assume the following rules:
A move is guaranteed to be valid and is placed on an empty block.
Once a winning condition is reached, no more moves is allowed.
A player who succeeds in placing n of their marks in a horizontal, vertical, or diagonal row wins the game.
Example:
Given n = 3, assume that player 1 is "X" and player 2 is "O" in the board.
TicTacToe toe = new TicTacToe(3);
toe.move(0, 0, 1); -> Returns 0 (no one wins)
|X| | |
| | | | // Player 1 makes a move at (0, 0).
| | | |
toe.move(0, 2, 2); -> Returns 0 (no one wins)
|X| |O|
| | | | // Player 2 makes a move at (0, 2).
| | | |
toe.move(2, 2, 1); -> Returns 0 (no one wins)
|X| |O|
| | | | // Player 1 makes a move at (2, 2).
| | |X|
toe.move(1, 1, 2); -> Returns 0 (no one wins)
|X| |O|
| |O| | // Player 2 makes a move at (1, 1).
| | |X|
toe.move(2, 0, 1); -> Returns 0 (no one wins)
|X| |O|
| |O| | // Player 1 makes a move at (2, 0).
|X| |X|
toe.move(1, 0, 2); -> Returns 0 (no one wins)
|X| |O|
|O|O| | // Player 2 makes a move at (1, 0).
|X| |X|
toe.move(2, 1, 1); -> Returns 1 (player 1 wins)
|X| |O|
|O|O| | // Player 1 makes a move at (2, 1).
|X|X|X|
Follow up:
Could you do better than O(n2) per move() operation?
Hint to solve: Use +1 for player 1 and -1 for player 2
Make separate array for rows and cols
Track diagonal and antidiagonal into an integer value.
Use dynamic programming for same row add the move value to it
Use dynamic programming for same col add the move value to it.
Check condition for diagonal and antidiagonal and update the value
Any player would win only if the
current row cell value reaches the size of grid
current col cell value reaches the size of grid
diagonal reaches the size of grid
antidiagonal reaches the size of grid
class TicTacToe:
def __init__(self, n: int):
"""
Initialize your data structure here.
"""
self.size = n
self.rows = [0 for _ in range(n)]
self.cols = [0 for _ in range(n)]
self.diagonal = 0
self.antiDiagonal = 0
self.MoveValue = 0
def move(self, row: int, col: int, player: int) -> int:
"""
Player {player} makes a move at ({row}, {col}).
@param row The row of the board.
@param col The column of the board.
@param player The player, can be either 1 or 2.
@return The current winning condition, can be either:
0: No one wins.
1: Player 1 wins.
2: Player 2 wins.
"""
MoveValue = 1 if player == 1 else -1
self.rows[row] += MoveValue
self.cols[col] += MoveValue
if row == col:
self.diagonal += MoveValue
if col == (len(self.cols) - row - 1):
self.antiDiagonal += MoveValue
#print(F'rows:{self.rows} cols:{self.cols} diagonal: {self.diagonal} antidiagonal: {self.antiDiagonal}')
if (abs(self.rows[row]) == self.size
or abs(self.cols[col]) == self.size
or abs(self.diagonal) == self.size
or abs(self.antiDiagonal) == self.size):
return player
return 0