Back to all solutions
#1275 - Find Winner on a Tic Tac Toe Game
Problem Description
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
/**
* @param {number[][]} moves
* @return {string}
*/
var tictactoe = function(moves) {
const rows = new Array(3).fill(0);
const cols = new Array(3).fill(0);
let diagonal = 0;
let antiDiagonal = 0;
for (let i = 0; i < moves.length; i++) {
const value = i % 2 === 0 ? 1 : -1;
const [row, col] = moves[i];
rows[row] += value;
cols[col] += value;
if (row === col) diagonal += value;
if (row + col === 2) antiDiagonal += value;
if ([rows[row], cols[col], diagonal, antiDiagonal].includes(3)) return 'A';
if ([rows[row], cols[col], diagonal, antiDiagonal].includes(-3)) return 'B';
}
return moves.length === 9 ? 'Draw' : 'Pending';
};