-
链接:https://www.nowcoder.com/questionTerminal/e1bb714eb9924188a0d5a6df2216a3d1?pos=19&mutiTagIds=639&orderByHotValue=0&questionTypes=000100
-
题目:井字棋
给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。
测试样例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true -
根据题目可知:
井字棋是什么? 是一种在3*3格子上进行的连珠游戏,任意三个标记形成一条直线,则为获胜
获胜情况:(1)行全为1 (2)列全为1 (3)主对角线全为1 (4)副对角线全为1 -
思路
4.1
思路1:如果只针对此题 二维数组永远是3*3 ,那么只需要行、列、对角线这几种情况的每个位置都等于1
4.2
思路2:如果二维数组是N * N ,那么只需要行的每个位置都等于1,并且相加为N就可以(通用) -
代码
思路1:
class Board {
public:
bool checkWon(vector<vector<int> > board) {
// write code here
int rows=board.size();//行
int cols=board[0].size();//列
int i=0,j=0;
//每行
for(int i=0;i<rows;i++)
{
if((board[i][0] == board[i][1]) &&
(board[i][0] == board[i][2]) &&
(board[i][0] == 1)){
return true;
}
}
//每列
for(int j=0;j<cols;j++)
{
if((board[0][j] == board[1][j]) &&
(board[0][j] == board[2][j]) &&
(board[0][j] == 1)){
return true;
}
}
//主对角线
if(board[0][0] == board[1][1] &&
board[0][0] == board[2][2] &&
board[0][0] == 1){
return true;
}
if(board[2][0] == board[1][1] &&
board[2][0] == board[0][2] &&
board[2][0] == 1){
return true;
}
return false;
}
};
思路2:
public:
bool checkWon(vector<vector<int> > board) {
// write code here
int rows=board.size();//是行数也是列数
int i,j,sum;
//检查每一行的和是否等于rows
for(int i=0;i<rows;i++)
{
sum=0;
for(int j=0;j<rows;j++)
{
sum+=board[i][j];
}
if(sum==rows)
return true;
}
//检查每一列的和是否等于rows
sum=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<rows;j++)
{
sum+=board[j][i];
}
if(sum==rows)
return true;
}
//检查主对角线的和是否等于rows
sum=0;
for(int i=0;i<rows;i++)
{
sum+=board[i][i];
}
if(sum==rows)
return true;
//检查符对角线的和是否等于rows
sum=0;
for(int i=0;i<rows;i++)
{
sum+=board[i][rows-1-i];
}
if(sum==rows)
return true;
return false;
}
};