題目
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。
示例 1:
輸入:
輸出: true
示例 2:
輸入:
輸出: false
解釋: 除了第一行的第一個數字從 5 改爲 8 以外,空格內其他數字均與 示例1 相同。
但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
一個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字符 '.' 。
給定數獨永遠是 9x9 形式的。
來源:力扣(LeetCode)
思路
使用 HashSet 來記錄已經存在過的狀態;
首先,將每個狀態編碼成爲一個字符串;
其次,對於每個1到9內的數字來說,其在每行每列和每個小區間內都是唯一的;
再次,將數字放在一個括號中,每行上的數字就將行號放在括號左邊,每列上的數字就將列數放在括號右邊,每個小區間內的數字就將在小區間內的行列數分別放在括號的左右兩邊;
這樣每個數字的狀態都是獨一無二的存在,就可以在 HashSet 中查找是否有重複存在了。
C++代碼
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board)
{
unordered_set<string> st;
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
if (board[i][j] == '.')
continue;
string t = "(" + to_string(board[i][j]) + ")";
string row = to_string(i) + t;
string col = t + to_string(j);
string cell = to_string(i / 3) + t + to_string(j / 3);
if (st.count(row) || st.count(col) || st.count(cell))
return false;
st.insert(row);
st.insert(col);
st.insert(cell);
}
}
return true;
}
};