井字棋 C++

2023年2月22日13:28:41
  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;
    }
};

  • 作者:azure°
  • 原文链接:https://blog.csdn.net/weixin_43807876/article/details/110548977
    更新时间:2023年2月22日13:28:41 ,共 1561 字。