例题描述
对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。
给定一个二维数组board
,代表当前棋盘,其中元素为1
的代表是当前玩家的棋子,为0
表示没有棋子,为-1
代表是对方玩家的棋子。
示例1:
- 输入:
[
[1,0,1],
[1,-1,-1],
[1,-1,0]
]
- 输出:
true
解题思路
井字棋有四种情况表示当前玩家获胜:(1
代表当前玩家棋子 )
- 行全为
1
, 即行的和为3
- 列全为
1
, 列的和为3
- 主对角全为
1
, 对角和为3
- 副对角全为
1
, 对角和为3
如果扩展为N*N
的话,判断和是否等于N
,下面代码适用任何情况:
代码实现
class Board {
public:
bool checkWon(vector<vector<int> > board) {
if(board.empty())
return false;
int row = board.size();
int i,j,sum;
//检查每一行的和是是否等于row
for(i = 0;i < row;i++){
sum = 0;
for(j = 0;j < row;j++){
sum += board[i][j];
}
if(sum == row)
return true;
}
//检查每一列的和是是否等于row
for(j = 0;j < row;j++){
sum = 0;
for(i = 0;i < row;i++){
sum += board[i][j];
}
if(sum == row)
return true;
}
//检查主对角线的和是是否等于row
sum = 0;
for(i = 0;i < row;i++){
sum += board[i][i];
}
if(sum == row)
return true;
//检查副对角线的和是是否等于row
sum = 0;
for(i = 0;i < row;i++){
sum += board[i][row - i - 1];
}
if(sum == row)
return true;
//都不满足,返回false
return false;
}
};