Leetcode 036 有效的數獨
阿新 • • 發佈:2020-10-16
地址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; } };