Skip to main content
Back to problems
#1275
Easy Algorithms

Find winner on a tic tac toe game

Array Hash Table Matrix Simulation
54.5% acceptance
Feb 25, 2026
1624
370
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 player B 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 ith 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.

Solution

Rust
Time O(n)
Space O(1)
LeetCode
solution.rs
impl Solution {
  pub fn tictactoe(moves: Vec<Vec<i32>>) -> String {
    let mut board = [[0i32; 3]; 3];
    for (i, m) in moves.iter().enumerate() {
      board[m[0] as usize][m[1] as usize] = if i % 2 == 0 { 1 } else { -1 };
    }

    let wins = |player: i32| -> bool {
      for i in 0..3 {
        if board[i].iter().all(|&x| x == player) { return true; }
        if (0..3).all(|j| board[j][i] == player) { return true; }
      }
      if (0..3).all(|i| board[i][i] == player) { return true; }
      if (0..3).all(|i| board[i][2-i] == player) { return true; }
      false
    };

    if wins(1) { "A".to_string() }
    else if wins(-1) { "B".to_string() }
    else if moves.len() == 9 { "Draw".to_string() }
    else { "Pending".to_string() }
  }
}