1. 程式人生 > >Leetcode演算法題(C語言)11--有效的數獨

Leetcode演算法題(C語言)11--有效的數獨

題目:有效的數獨

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

1 數字 1-9 在每一行只能出現一次。
2 數字 1-9 在每一列只能出現一次。
3 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
在這裡插入圖片描述
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。

示例 1:

輸入:
[
  ["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

示例 2:

輸入:
[
  ["8","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"]
]
輸出: false

解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。
但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
一個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字元 ‘.’ 。
給定數獨永遠是 9x9 形式的。

程式碼實現:

bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
    int i, j, k; 
    
    /* 判斷每行陣列中的值是否只出現一次 */
for(k = 0; k < boardRowSize; k++) { for(i = 0; i < boardColSize - 1; i++) { for(j = i + 1; j < boardColSize; j++) { if(board[k][i] == '.') break; else if(board[k][j] == '.') continue; else if(board[k][i] == board[k][j]) return false; } } } /* 判斷每列陣列中的值是否只出現一次 */ for(k = 0; k < boardColSize; k++) { for(i = 0; i < boardRowSize - 1; i++) { for(j = i + 1; j < boardRowSize; j++) { if(board[i][k] == '.') break; else if(board[j][k] == '.') continue; else if(board[i][k] == board[j][k]) return false; } } } /* 判斷3x3矩陣中的值是否只出現一次 */ int a = 0, b = 0, c = 0, d = 0; int row = 0, col = 0; int num; for(num = 0; num < 9; num++) { for(a = row; a < 3 + row; a++) { for(b = col; b < 3 + col; b++) { /* 判斷值為.,則判斷下一個 */ if(board[a][b] == '.') { continue; } /* 判斷3x3矩陣是否有相等的值 */ for(c = 0 + row;c < 3 + row; c++) { for(d = 0 + col; d < 3 + col; d++) { if(board[c][d] == '.') continue; else if((a != c) && (b != d) && (board[a][b] == board[c][d])) return false; } } } } /* 移動至下一個3x3矩陣 */ col += 3; if(col >= 9) { col = 0; row += 3; } } return true; }

思考邏輯
1 先判斷每行中的每個元素除了’.‘是否有相同的;
2 判斷每列中的每個元素除了’.‘是否有相同的;
3 判斷每一個3x3矩陣中除了’.'是否有相同的;
4 都不同則返回true,否則返回false;