井字棋
题目描述:
对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。
给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代表是对方玩家的棋子。
思路:
题目很简单,判断玩家赢:玩家用1表示,且是井字棋,3 * 3的,那么直接按照规则,判断横行相加是否为3,列相加是否为3,对角线相加是否为3即可。
方法二:扩展到n行n列:看代码把,一看就懂。
bool checkWon(vector<vector<int> > a) {
if(a[0][0]+a[1][1]+a[2][2]==3)
return true;
if(a[0][2]+a[1][1]+a[2][0]==3)
return true;
for(int i=0;i<3;i++){
if(a[i][0]+a[i][1]+a[i][2]==3)
return true;
if(a[0][i]+a[1][i]+a[2][i]==3)
return true;
}
return false;
}
-----------------------------------------------------------
class Board {
public:
bool checkWon(vector<vector<int> > board) {
// write code here
int size = board[0].size();
for(int i = 0; i < board.size(); i++)
{
int sum = 0;
for(int j = 0; j < size; j++)
{
sum += board[i][j];
}
if(sum == size) // 检查行
return true;
}
for(int i = 0; i < board.size(); i++)
{
int sum = 0;
for(int j = 0; j < size; j++)
{
sum += board[j][i];
}
if(sum == size)//检查列
return true;
}
int tmp = 0;
for(int i = 0; i < size; i++)
{
tmp += board[i][i];//主对角线
}
if(tmp == size)
return true;
tmp = 0;
for(int i = 0; i < size; i++)
{//副对角线
tmp += board[i][size - i - 1];
}
if(tmp == size)
return true;
return false;
}
};