井字棋 C++

首页 / 新闻资讯 / 正文

  1. 链接:https://www.nowcoder.com/questionTerminal/e1bb714eb9924188a0d5a6df2216a3d1?pos=19&mutiTagIds=639&orderByHotValue=0&questionTypes=000100

  2. 题目:井字棋
    给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。
    测试样例:
    [[1,0,1],[1,-1,-1],[1,-1,0]]
    返回:true

  3. 根据题目可知:
    井字棋是什么? 是一种在3*3格子上进行的连珠游戏,任意三个标记形成一条直线,则为获胜
    获胜情况:(1)行全为1 (2)列全为1 (3)主对角线全为1 (4)副对角线全为1

  4. 思路
    4.1
    思路1:如果只针对此题 二维数组永远是3*3 ,那么只需要行、列、对角线这几种情况的每个位置都等于1
    4.2
    思路2:如果二维数组是N * N ,那么只需要行的每个位置都等于1,并且相加为N就可以(通用)

  5. 代码
    思路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;     } };