链接: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; } };