題目描述
對於一個給定的井字棋棋盤,請設計一個高效算法判斷當前玩家是否獲勝。
給定一個二維數組board,代表當前棋盤,其中元素爲1的代表是當前玩家的棋子,爲0表示沒有棋子,爲-1代表是對方玩家的棋子。
測試樣例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true
思路
井字棋有四種情況表示當前玩家獲勝,1代表當前玩家棋子
- 行全爲1, 即行的和爲3
- 列全爲1, 列的和爲3
- 主對角全爲1, 對角和爲3
- 副對角全爲1, 對角和爲3
- 如果擴展爲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;
}
};
如有不同見解,歡迎留言討論~~