题目描述
设计一个在n×n网格上两个玩家之间玩的Tic-tac-toe游戏。
您可以假定以下规则:
1.一个移动被保证是有效的,并且被放置在一个空块上。
2.一旦达到获胜条件,就不再允许移动。
3.成功地在水平、垂直或对角线行中放置n个分数的玩家赢得比赛。
样例
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|
算法1
思路:
1.定义二维数组rows,cols,一维数组diag,adiag
rows[i][j]:i代表矩阵第i行,j代表第j个玩家;rows[i][j]表示第j个玩家占领了第i行的多少个位置
cols[i][j]:i代表矩阵第i列,j代表第j个玩家;cols[i][j]表示第j个玩家占领了第i列的多少个位置
diag[i]:i代表第i个玩家,diag[i]表示第i个玩家占领了正对角线的多少个位置
adiag[i]:i代表第i个玩家,adiag[i]表示第i个玩家占领了反对角线的多少个位置
2.如果占领位置总数到达n,表示玩家赢了
C++ 代码
class TicTacToe {
public:
vector> rows;
vector> cols;
vector diag;
vector adiag;
int size;
/** Initialize your data structure here. */
TicTacToe(int n) {
size = n;
rows.resize(n, vector(2, 0));
cols.resize(n, vector(2, 0));
diag.resize(2);
adiag.resize(2);
}
int move(int row, int col, int player) {
rows[row][player - 1] ++;
if (rows[row][player - 1] == size) return player;
cols[col][player - 1] ++;
if (cols[col][player - 1] == size) return player;
if (row == col) {
diag[player - 1] ++;
if (diag[player - 1] == size) return player;
}
if (row + col == size - 1) {
adiag[player - 1] ++;
if (adiag[player - 1] == size) return player;
}
return 0;
}
};
/**
* Your TicTacToe object will be instantiated and called as such:
* TicTacToe obj = new TicTacToe(n);
* int param_1 = obj.move(row,col,player);
*/