36.有效的数独
看答案罢,就是遍历board,row(i,num)=1代表第i行的数字num已有,col(j,num)=1代表第j列的num已有,box[(i/3)*3+j/3][num]代表下标为(i/3)*3+j/3的九字格中已有num。
答案很easy,🥚唔想不到。
37.解数独
相当于有几个位置,让你从1-9选个数字去填,但要满足if条件(该行,该列,该九宫格都没这个数)才能填上数字。
思路也好理解,就是麻饭且难想到,毕竟有四个数组。另外就是全局变量尽量不要直接复制,要不然显示各种错误,比如测试时各种用例没问题,提交显示却只能通过一个,奇怪。
int box[3][3][10];
记录一个九宫格的数是否已有,九宫格看成了一个一维数组。
int row[9][10];
int col[9][10];
int *b[81];
记录缺少数的格子的坐标。
bool ans;
int bsize;
记录一开始数独缺多少个数。
void dfs(char**board,int pos){
pos是指已填了几个数
if(bsize==pos){
ans=true;
return;}
int i=b[pos][0],j=b[pos][1];
for(int k=1;k<10&&ans!=true;k++){
if(!row[i][k]&&!col[j][k]&&!box[i/3][j/3][k]){
board[i][j]=k+'0';
字符转化为数字。
row[i][k]=col[j][k]=box[i/3][j/3][k]=1;
dfs(board,pos+1);
row[i][k]=col[j][k]=box[i/3][j/3][k]=0;
}
}
}
void solveSudoku(char** board, int boardSize, int* boardColSize){
memset(box,0,sizeof(box));
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
ans=false;
bsize=0;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]=='.'){
b[bsize]=malloc(sizeof(int)*2);
b[bsize][0]=i;
b[bsize++][1]=j;
}else{
int num=board[i][j]-'0';
row[i][num]=col[j][num]=box[i/3][j/3][num]=1;
}
}
}
dfs(board,0);
}