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?
Solution:
1 public class TicTacToe { 2 int[] rowCount; 3 int[] colCount; 4 int leftDiagCount, rightDiagCount; 5 int winner; 6 int num; 7 8 /** Initialize your data structure here. */ 9 public TicTacToe(int n) { 10 num = n; 11 rowCount = new int[n]; 12 colCount = new int[n]; 13 leftDiagCount = rightDiagCount = 0; 14 winner = 0; 15 } 16 17 /** Player {player} makes a move at ({row}, {col}). 18 @param row The row of the board. 19 @param col The column of the board. 20 @param player The player, can be either 1 or 2. 21 @return The current winning condition, can be either: 22 0: No one wins. 23 1: Player 1 wins. 24 2: Player 2 wins. */ 25 public int move(int row, int col, int player) { 26 if (winner!=0) return winner; 27 28 int delta = (player==1) ? 1 : -1; 29 rowCount[row] += delta; 30 colCount[col] += delta; 31 if (row==col) leftDiagCount += delta; 32 if (row+col == num-1) rightDiagCount += delta; 33 34 if (Math.abs(rowCount[row]) == num || Math.abs(colCount[col])==num || Math.abs(leftDiagCount) == num || Math.abs(rightDiagCount) == num){ 35 winner = player; 36 } 37 38 return winner; 39 } 40 } 41 42 /** 43 * Your TicTacToe object will be instantiated and called as such: 44 * TicTacToe obj = new TicTacToe(n); 45 * int param_1 = obj.move(row,col,player); 46 */