1. 程式人生 > >【LeetCode】36. 有效的數獨

【LeetCode】36. 有效的數獨

題目描述

判斷一個 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; } };