348. Design Tic-Tac-Toe
Medium
44332FavoriteShare
Design a Tic-tac-toe game that is played between two players on a n x n grid.
You may assume the following rules:
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?
Accepted
54,270
Submissions
106,969
n*n的棋盘 两个人轮流玩
是否可以连着线 算赢
时间复杂度小一些
就想到分成两个数组存储了
class TicTacToe {
public:
/** Initialize your data structure here. */
vectorhor[2];
vectorver[2];
int dia[2][2];
int size;
TicTacToe(int n) {
for(int i = 0; i < n; i++) {
hor[0].push_back(0);
hor[1].push_back(0);
ver[0].push_back(0);
ver[1].push_back(0);
}
size = n;
dia[0][0] = 0;
dia[1][0] = 0;
dia[0][1] = 0;
dia[1][1] = 0;
}
/** 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. */
bool judge (int role) {
for (int i = 0; i < size; i ++) {
//printf("i=%d,hor=%d,ver=%d\n",i,hor[role-1][i],ver[role-1][i]);
if (hor[role - 1][i] == size || ver[role - 1][i] == size) {
return true;
}
}
if (dia[role -1][0] == size || dia[role-1][1] == size)
return true;
return false;
}
int move(int row, int col, int player) {
hor[player - 1][row] ++;
ver[player - 1][col] ++;
if (row == col) {
dia[player - 1][0] ++;
}
if (row + col == size - 1) {
dia[player - 1][1] ++;
}
if (judge(player))
return player;
return false;
}
};
/**
* Your TicTacToe object will be instantiated and called as such:
* TicTacToe* obj = new TicTacToe(n);
* int param_1 = obj->move(row,col,player);
*/