题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
设0的数量是num,信息量就是9的num次方,令最大寻找次数等于信息量,就不会出错
#include <stdio.h>
int mat[9][9];
int lable;
int check(int row,int col,int val)
{
for(int i=0;i<9;i++)
if(mat[row][i]==val)return 0;
for(int i=0;i<9;i++)
if(mat[i][col]==val)return 0;
for(int i=(col/3)*3;i<(col/3)*3+3;i++)
for(int j=(row/3)*3;j<(row/3)*3+3;j++)
if(mat[j][i]==val)return 0;
return 1;
}
void dfsmat(int a,int b)
{
if(b==9)
{
a+=1;
b=0;
}
if(a==9){lable=1;return;}
if(mat[a][b]==0)
for(int i=1;i<=9;i++)
{
if(check(a,b,i)==1)
{
mat[a][b]=i;
dfsmat(a,b+1);//进入下一层找通道
if(lable==1)//拿到钥匙后直接出循环
return;
mat[a][b]=0;
}
}
else dfsmat(a,b+1);
}
int main() {
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
scanf("%d",&mat[i][j]);
dfsmat(0,0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d ",mat[i][j]);
printf("\n");
}
return 0;
}



