1. 程式人生 > 實用技巧 >Leetcode 036 有效的數獨

Leetcode 036 有效的數獨

地址https://leetcode-cn.com/problems/valid-sudoku/

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

數字1-9在每一行只能出現一次。
數字1-9在每一列只能出現一次。
數字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形式的。

解答

使用 三個陣列 標記 各個方塊 各行各列 已經使用的數字 ,放置重複使用即可

塊的IDX索引計算需要一點小轉折 其他沒什麼問題

class Solution {
public:
    int rec[9][10] = { 0 };
    int row[9][10] = { 0 };
    int col[9][10] = { 0 };
    bool isValidSudoku(vector<vector<char>>& board) {
        for (int x = 0; x < 9; x++) {
            for (int y = 0; y < 9; y++) {
                if (board[x][y] != '.') {
                    int n = board[x][y] - '0';
                    int recX = x / 3; int recY = y / 3;
                    int recIdx = recX * 3 + recY;
                    if (rec[recIdx][n] == 1) 
                        return false;
                    else rec[recIdx][n] = 1;

                    if (row[x][n] == 1) 
                        return false;
                    else row[x][n] = 1;

                    if (col[y][n] == 1) 
                        return false;
                    else col[y][n] = 1;
                }
            }
        }


        return true;
    }
};