问题描述 :
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
示例 1:
输入:
53…7…
6…195…
.98…6.
8…6…3
4…8.3…1
7…2…6
.6…28.
…419…5
…8…79
输出: true
示例 2:
输入:
83…7…
6…195…
.98…6.
8…6…3
4…8.3…1
7…2…6
.6…28.
…419…5
…8…79
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 ‘.’ 。
给定数独永远是 9x9 形式的。
输入说明 :
输入9行,每行9个字符,只包含数字 1-9 和字符 ‘.’
输出说明 :
输出true或false
输入范例 :
83…7…
6…195…
.98…6.
8…6…3
4…8.3…1
7…2…6
.6…28.
…419…5
…8…79
输出范例 :
false
#include<iostream>
#include<vector>
#include<map>
using namespace std;
bool isValidSudoku(vector<vector<char>> &board){
int row[9][10] = {0};// 哈希表存储每一行的每个数是否出现过,默认初始情况下,每一行每一个数都没有出现过
// 整个board有9行,第二维的维数10是为了让下标有9,和数独中的数字9对应。
int col[9][10] = {0};// 存储每一列的每个数是否出现过,默认初始情况下,每一列的每一个数都没有出现过
int box[9][10] = {0};// 存储每一个box的每个数是否出现过,默认初始情况下,在每个box中,每个数都没有出现过。整个board有9个box。
for(int i=0; i<9; i++){
for(int j = 0; j<9; j++){
// 遍历到第i行第j列的那个数,我们要判断这个数在其所在的行有没有出现过,
// 同时判断这个数在其所在的列有没有出现过
// 同时判断这个数在其所在的box中有没有出现过
if(board[i][j] == '.') continue;
int curNumber = board[i][j]-'0';
if(row[i][curNumber]) return false;
if(col[j][curNumber]) return false;
if(box[j/3 + (i/3)*3][curNumber]) return false;
row[i][curNumber] = 1;// 之前都没出现过,现在出现了,就给它置为1,下次再遇见就能够直接返回false了。
col[j][curNumber] = 1;
box[j/3 + (i/3)*3][curNumber] = 1;
}
}
return true;
}
int main(){
vector<vector<char> > board;
char ch;
for(int i=0; i<9; i++){
vector<char> aLine;
for(int j=0; j<9; j++) {
cin>>ch;
aLine.push_back(ch);
}
board.push_back(aLine);
}
bool res=isValidSudoku(board);
cout<<(res?"true":"false")<<endl;
return 0;
}