[每日一題]58:井字棋

題目描述

對於一個給定的井字棋棋盤,請設計一個高效算法判斷當前玩家是否獲勝。
給定一個二維數組board,代表當前棋盤,其中元素爲1的代表是當前玩家的棋子,爲0表示沒有棋子,爲-1代表是對方玩家的棋子。

測試樣例:

[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true

思路

井字棋有四種情況表示當前玩家獲勝,1代表當前玩家棋子

  1. 行全爲1, 即行的和爲3
  2. 列全爲1, 列的和爲3
  3. 主對角全爲1, 對角和爲3
  4. 副對角全爲1, 對角和爲3
  5. 如果擴展爲N*N的話,判斷和是否等於N,下面代碼適用任何情況

解答代碼:

class Board {
public:
    bool checkWon(vector<vector<int> > board) {
        int row = board.size(); 
        int i,j,sum; 
        
        //檢查每一行的和是是否等於row 
        for(i = 0; i < row; i++){
            sum = 0;
            for(j = 0; j < row; j++)
            {
                sum += board[i][j];
            }
            if(sum == row)
                return true;
        }
        
        // 檢查每一列的和是是否等於row 
        for(j = 0; j < row; j++){
            sum = 0;
            for(i = 0; i < row; i++)
            {
                sum += board[i][j];
            }
            if(sum == row)
                return true;
        }
        
        //檢查主對角線的和是是否等於row
        sum = 0;
        for(i = 0; i < row; i++){
            sum += board[i][i];
        }
        if(sum == row)
            return true;
        
        //檢查副對角線的和是是否等於row
        sum = 0;
        for(i = 0; i < row; i++){
            sum += board[i][row - 1 - i];
        }
        if(sum == row)
            return true;
        
        // 以上情況都不滿足
        return false;
    }
};

如有不同見解,歡迎留言討論~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章