数独DFS实现

#include <stdio.h>
#include <math.h>

#define N 9 //默认为9x9的数独

typedef struct
{
int x;
int y;
} Point;
Point P[N*N];
int A[N][N];
int Cnt,Flag;

void Init()
{
int i,j;
Cnt=Flag=0;
char Str[N];
for(i=0;i<N;++i)
{
scanf("%s",Str);
for(j=0;j<N;++j)
{
if(Str[j]=='?')
{
A[i][j]=0;
P[Cnt].x=i;
P[Cnt].y=j;
++Cnt;
}
else
{
A[i][j]=Str[j]-'0';
}
}
}
return;
}

int Judge(int n,int k)
{
int i,j,x,y,temp;
for(i=0;i<N;++i)
{
if(A[P[n].x][i]==k&&i!=P[n].y)
{
return 0;
}
if(A[i][P[n].y]==k&&i!=P[n].x)
{
return 0;
}
}
temp=sqrt(N);
x=(P[n].x/temp)*temp;
y=(P[n].y/temp)*temp;
for(i=0;i<temp;++i)
{
for(j=0;j<temp;++j)
{
if(A[x+i][y+j]==k&&((x+i)!=P[n].x||(y+j)!=P[n].y))
{
return 0;
}
}
}
return 1;
}

void DFS(int n)
{
int i;
if(n==Cnt)
{
Flag=1;
return;
}
for(i=1;i<=N;++i)
{
if(1==Judge(n,i))
{
A[P[n].x][P[n].y]=i;
DFS(n+1);
if(Flag==1)
{
return;
}
A[P[n].x][P[n].y]=0;
}
}
return;
}

void Show()
{
int i,j;
for(i=0;i<N;++i)
{
for(j=0;j<N;++j)
{
printf("%d",A[i][j]);
}
printf("\n");
}
return;
}

int main()
{
Init();
DFS(0);
Show();
return 0;
}

对于给定图为:

输入应为:

426?397??
1??????6?
??98?????
5?????1??
2??458???
98?7??5??
6?7??3??5
?????14??
???????2?

返回结果:

426139758
138275964
759864231
564392187
271458693
983716542
647923815
392581476
815647329 

原文地址:https://www.cnblogs.com/NoSoul/p/2236397.html