很经典的题,可以参考力扣第36题
36. 有效的数独
附上完整面试输入输出代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool judge(char board[][9]){
vector<int> count(9, 0); //分别记录1-9出现的情况 bit 0-8:squart; bit 9-17: row; bit 18-26: column
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
int val = board[i][j] - '0'
if(val>0&&val<10){
val--;
int sq_num=(i/3)*3+j/3;
if (((count[val] >> squart_num) & 1) || ((count[val] >> (9 + i)) & 1)\
|| ((count[val] >> (18 + j)) & 1) ) //第squart_num九宫格、第i行、第j列均未出现过
return false;
else{
count[val] += (1 << squart_num) + (1 << (i + 9)) + (1 << (j + 18));
}
}
}
}
return true;
}
int main(){
char[9][9] sq;
for(int i=0;i<9;i++){
cin.getline(sq[i],10);//这里需要长度比实际多1,因为包含回车'\r'
}
if(judge(sq)){
cout<<"true"<<endl;
}
else{
cout<<"false"<<endl;
}
return 0;
}