数独程序实现

这个数独的程序快的我自己都不太相信,毫无优化单纯深搜,速度还是令人满意的。直接上代码:

#include
#include
int vis[101][101]={0},vis2[101][101]={0},vis3[101][101]={0},vis4[101][101]={0},w[101][101]={0},ans[101][101]={0};
int flag=0;
void write()
{
    int i,j;
    printf("\n");
    for(i=1;i<=9;i++)
      {
      if((i-1)%3==0)
        printf("---------------------------\n");
      for(j=1;j<=9;j++)
        {
          printf("%d ",w[i][j]);
          if(j%3==0)
            printf(" | ");
        }
      printf("\n");
      }
    printf("---------------------------\n");
    return;
}
int dfs(int x,int y)
{
    int i;
    if(flag==1)
      return 0;
    if(x==10&&y==1)
      {
       write();
       //flag=1;
       return 0;
      }
    if(vis[x][y]==1||w[x][y]!=0)
      {
      if(y==9)
        dfs(x+1,1);
      else dfs(x,y+1);
      return 0;
      }
    for(i=1;i<=9;i++)
      if(vis2[x][i]==0&&vis3[y][i]==0&&vis4[(x-1)/3+(y-1)/3*3][i]==0)
        {
        vis2[x][i]=1;
        vis3[y][i]=1;
        vis4[(x-1)/3+(y-1)/3*3][i]=1;
        w[x][y]=i;
        if(y==9)
         dfs(x+1,1);
        else dfs(x,y+1);
        w[x][y]=0;
        vis2[x][i]=0;
        vis3[y][i]=0;
        vis4[(x-1)/3+(y-1)/3*3][i]=0;
        }
    return 0;
}
int main()
{
    int i,j;
    for(i=1;i<=9;i++)
      for(j=1;j<=9;j++)
        {
        scanf("%d",&w[i][j]);
        if(w[i][j]!=0)
          {
           vis[i][j]=1;
           vis2[i][w[i][j]]=1;
           vis3[j][w[i][j]]=1;
           vis4[(i-1)/3+(j-1)/3*3][w[i][j]]=1;
          }
        }
    write();
    printf("\n");
    dfs(1,1);
    return 0;
}

第一次write是想让输入看的更清楚一些。

你可能感兴趣的:(数独程序实现)