1275. Find Winner on a Tic Tac Toe Game
🟩 Easy
Tic-tac-toe is played by two players A
and B
on a 3 x 3
grid. The rules of Tic-Tac-Toe are:
Players take turns placing characters into empty squares
' '
.The first player
A
always places'X'
characters, while the second playerB
always places'O'
characters.'X'
and'O'
characters are always placed into empty squares, never on filled ones.The game ends when there are three of the same (non-empty) character filling any row, column, or diagonal.
The game also ends if all squares are non-empty.
No more moves can be played if the game is over.
Given a 2D integer array moves
where moves[i] = [rowi, coli]
indicates that the i^th
move will be played on grid[rowi][coli]
. return the winner of the game if it exists (A
or B
). In case the game ends in a draw return "Draw"
. If there are still movements to play return "Pending"
.
You can assume that moves
is valid (i.e., it follows the rules of Tic-Tac-Toe), the grid is initially empty, and A
will play first.
Example 1

Input: [[0,0],[2,0],[1,1],[2,1],[2,2]] Output: "A" Explanation: A wins, they always play first.
Example 2

Input: [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]] Output: "B Explanation: B wins
Constraints
1 <= moves.length <= 9
moves[i].length == 2
0 <= rowi, coli <= 2
There are no repeated elements on
moves
.moves
follow the rules of tic tac toe
Hint-1
It's straightforward to check if A or B won or not, check for each row/column/diag if all the three are the same.
Hint-2
Then if no one wins, the game is a draw if the board is full, i.e. moves.length = 9 otherwise is pending.
Solution
My Solution
func tictactoe(moves [][]int) string {
grid := [3][3]int{}
for i, move := range moves {
grid[move[0]][move[1]] = i&1 + 1
}
for i := 0; i < 3; i++ {
if player := grid[i][i]; player != 0 {
if (grid[i][0] == grid[i][1] && grid[i][0] == grid[i][2]) ||
(grid[0][i] == grid[1][i] && grid[0][i] == grid[2][i]) {
return string(byte('@' + player))
}
}
}
if player := grid[1][1]; player != 0 {
if (grid[0][0] == grid[2][2] && grid[0][0] == player) ||
(grid[2][0] == grid[0][2] && grid[2][0] == player) {
return string(byte('@' + player))
}
}
if len(moves) != 9 {
return "Pending"
}
return "Draw"
}
Optimal solution
func tictactoe(moves [][]int) string {
// Initialize score arrays
rows, cols := [3]int{}, [3]int{}
diagonal, antiDiagonal := 0, 0
// Iterate over moves
for i, move := range moves {
player := 1 // Player A
if i%2 == 1 {
player = -1 // Player B
}
row, col := move[0], move[1]
// Update scores
rows[row] += player
cols[col] += player
if row == col {
diagonal += player
}
if row+col == 2 {
antiDiagonal += player
}
// Check for a winner
if rows[row] == 3 || cols[col] == 3 || diagonal == 3 || antiDiagonal == 3 {
return "A"
}
if rows[row] == -3 || cols[col] == -3 || diagonal == -3 || antiDiagonal == -3 {
return "B"
}
}
// Determine game state
if len(moves) == 9 {
return "Draw"
}
return "Pending"
}

Leetcode: link
Last updated
Was this helpful?