【LeetCode】36. 有效的數獨
阿新 • • 發佈:2018-12-17
題目描述
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。
示例
[ [“5”,“3”,".",".",“7”,".",".",".","."], [“6”,".",".",“1”,“9”,“5”,".",".","."], [".",“9”,“8”,".",".",".",".",“6”,"."], [“8”,".",".",".",“6”,".",".",".",“3”], [“4”,".",".",“8”,".",“3”,".",".",“1”], [“7”,".",".",".",“2”,".",".",".",“6”], [".",“6”,".",".",".",".",“2”,“8”,"."], [".",".",".",“4”,“1”,“9”,".",".",“5”], [".",".",".",".",“8”,".",".",“7”,“9”] ] 輸出: true
說明:
- 一個有效的數獨(部分已被填充)不一定是可解的。
- 只需要根據以上規則,驗證已經填入的數字是否有效即可。
- 給定數獨序列只包含數字 1-9 和字元 ‘.’ 。
- 給定數獨永遠是 9x9 形式的。
解決方法
分別對每一行、每一列及每一個3*3宮格進行驗證
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for (int i=0;i<9;i++) //驗證每一行
if (!isRow(board,i))
return false;
for (int i=0;i<9;i++) //驗證每一列
if (!isColumn(board,i))
return false;
for (int i=0;i<9;i++) //驗證每一個3x3宮
if (!isPalace(board,i))
return false;
return true;
}
private:
bool isRow(vector<vector<char>> board, int row){
vector<int> times(10,0);
for (int i=0;i<9;i++)
if (isdigit(board[row][i])) times[board[row][i]-'0']++;
for (int i=0;i<10;i++)
if (times[i]>=2) return false;
return true;
}
bool isColumn(vector<vector<char>> board, int column){
vector<int> times(10,0);
for (int i=0;i<9;i++)
if (isdigit(board[i][column])) times[board[i][column]-'0']++;
for (int i=0;i<10;i++)
if (times[i]>=2) return false;
return true;
}
bool isPalace(vector<vector<char>> board, int k){
vector<int> times(10,0);
int startX,startY;
if (k==0) {startX=0;startY=0;}
if (k==1) {startX=0;startY=3;}
if (k==2) {startX=0;startY=6;}
if (k==3) {startX=3;startY=0;}
if (k==4) {startX=3;startY=3;}
if (k==5) {startX=3;startY=6;}
if (k==6) {startX=6;startY=0;}
if (k==7) {startX=6;startY=3;}
if (k==8) {startX=6;startY=6;}
for (int i=startX;i<startX+3;i++)
for (int j=startY;j<startY+3;j++)
if (isdigit(board[i][j])) times[board[i][j]-'0']++;
for (int i=0;i<10;i++)
if (times[i]>=2) return false;
return true;
}
};