判断一个 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
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int count = 0;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int n = j; n < 8; n++) {
if (board[i][j] != board[i][n + 1] || board[i][j] == '.') {
count++;
}
else {
return 0;
}
}
for (int m = i; m < 8; m++) {
if (board[i][j] != board[m + 1][j] || board[i][j] == '.') {
count++;
}
else {
return 0;
}
}
}
}
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j += 3) {
int map[10] = {0};
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
if (board[k][l] == '.') {
count++;
continue;
}
int num = board[k][l] - '0';
if (map[num] == 1)return false;
map[num] = 1;
count++;
}
}
}
}
if (count == 729) {
return 1;
}
else {
return 0;
}
}
};
int main() {
Solution ans;
vector<vector<char>> m = {
{ '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' } };
cout << ans.isValidSudoku(m) << endl;
system("pause");
return 0;
}
参考:https://blog.csdn.net/runningtortoises/article/details/45830627