题目:对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。
给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代
表是对方玩家的棋子。
测试样例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true
分析:井字棋盘判断玩家是否赢了(3*3的棋盘)由于玩家下的棋子是1,因此判断行和、列和、主对角和、副对角和是否等于3(行数)
bool is_win(const vector<vector<int>>& vv)
{
int row = vv.size();//二维数组的行数(即棋盘的大小)
//看有没有行之和是row的
for (int i = 0; i < row; i++)
{
int sum_row = 0;
int sum_cow = 0;
for (int j = 0; j < row; j++)
{
sum_row += vv[i][j];
sum_cow += vv[j][i];
}
if (sum_row == row)//只要有一行之和是row,就说明玩家赢了
{
return true;
}
if (sum_cow == row)//只要有一列之和是row,就说明玩家赢了
{
return true;
}
}
//看看主对角线、副对角线
int first = 0;
int second = 0;
for (int i = 0; i < row; i++)
{
first += vv[i][i];
second += vv[i][row - 1 - i];
}
if (first == row)
{
return true;
}
if (second == row)
{
return true;
}
//来到这,说明没有一个可能成功,即失败
return false;
}