SuDoKu_DFS_9*9

40Ms

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <time.h>
  4 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
  5 int num[9][9];
  6 void Dfs(int,int);
  7 bool Check();       //检测数独数组是否满足要求 
  8 bool Check_(int,int,int);  //检测一行&一列&3*3小格子是否有相同的数 
  9 
 10 void input(void)
 11 {
 12    char str[10];
 13    for(int i=0;i<9;i++)
 14       {
 15          scanf("%s",str);
 16          for(int j=0;j<9;j++)
 17             num[i][j]=str[j]-'0';
 18       }
 19 }
 20 
 21 int main()
 22 {
 23    input();
 24    clock_t start=clock();
 25    Dfs(0,0);
 26    printf("Time: %ld Ms",clock()-start);
 27    fflush(stdin);
 28    getchar();
 29    return 0;  
 30 }
 31 
 32 void Dfs(int x,int y)
 33 {
 34    int i,j,k;
 35    if(Check())
 36       {
 37          for(i=0;i<9;i++)
 38             {
 39                for(j=0;j<9;j++)
 40                   printf("%d ",num[i][j]);
 41                printf("\n");
 42             }
 43          printf("\n");
 44          return;
 45       }
 46    if(num[x][y]==0)
 47       {
 48          for(i=1;i<10;i++)
 49             {  
 50                if(Check_(x,y,i))    continue;//检测一行&一列&3*3小格子是否有相同的数
 51                num[x][y]=i;
 52                //printf("i:%d,j:%d\n",x,y);  
 53                if(y+1<9)
 54                   Dfs(x,y+1);
 55                else if(y+1==9)
 56                   Dfs(x+1,0);
 57             }
 58          num[x][y]=0;
 59       }
 60    else if(num[x][y]!=0)
 61       {
 62          if(y+1<9)   
 63             Dfs(x,y+1);
 64          else if(y+1==9)
 65             Dfs(x+1,0);
 66       }                
 67    return;
 68 }
 69 
 70 bool Check(void)
 71 {
 72    int i,j;
 73    for(i=0;i<9;i++)
 74       for(j=0;j<9;j++)
 75          if(num[i][j]==0)
 76             return false;
 77    return true;      
 78 }
 79 
 80 bool Check_(int x,int y,int n)
 81 {
 82    int i,j;
 83    for(i=0;i<9;i++)
 84       {
 85          if(num[x][i]==n)   return true;
 86          if(num[i][y]==n)   return true;   
 87       }
 88    for(i=x/3*3;i<x/3*3+3;i++)
 89       for(j=y/3*3;j<y/3*3+3;j++)
 90          if(num[i][j]==n)
 91             return true;
 92    return false;
 93 }
 94 /*
 95 070680050
 96 000000001
 97 409507000
 98 560000340
 99 000000000
100 034000017
101 000703804
102 300000000
103 090015030
104 */

 

posted @ 2013-06-04 21:59  瓶哥  Views(142)  Comments(0Edit  收藏  举报