poj2676 Sudoku

这题目是一道求解数独的题目。

做了简单优化,也从网上找了不少数据测试都OK,然后提交就TLE。最后看了下DISCUSS。发现说倒着搜能过,正着搜超时。

然后我只是把i=1;i<=81;++i 改成了i=81;i>=1;--i

。。。。过了。。。

我的代码进行了优化,剔除了一定不会出现在该位置的值。所以略长,不过很好理解。大家请欣赏!

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <math.h>
  4 #include <stdlib.h>
  5 int gird[10][10];
  6 int res[10][10];
  7 int cnt=0;
  8 int su;
  9 void copyy(){
 10     int i,j;
 11     for(i=1;i<10;++i)    for(j=1;j<10;++j) res[i][j]=gird[i][j];
 12     return ;
 13 }
 14 int ifff(){
 15     int i,j,k;
 16     int I,J,K;
 17     int t;
 18     int sign[10];
 19 
 20     for(i=1;i<=9;++i){
 21         for(j=1;j<=9;++j){
 22             memset(sign,0,sizeof(sign));
 23             for(I=1;I<=9;++I)
 24                 sign[gird[I][j]]=1;
 25             for(k=1;k<=9;++k)
 26                 if(sign[k]==0) return 0;
 27             memset(sign,0,sizeof(sign));
 28             for(J=1;J<=9;++J)
 29                 sign[gird[i][J]]=1;
 30             for(k=1;k<=9;++k)
 31                 if(sign[k]==0) return 0;
 32         }
 33     }
 34     // 1
 35     memset(sign,0,sizeof(sign));
 36     for(i=1;i<=3;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
 37     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 38     // 2
 39     memset(sign,0,sizeof(sign));
 40     for(i=1;i<=3;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
 41     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 42     // 3
 43     memset(sign,0,sizeof(sign));
 44     for(i=1;i<=3;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
 45     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 46     // 4
 47     memset(sign,0,sizeof(sign));
 48     for(i=4;i<=6;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
 49     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 50     // 5
 51     memset(sign,0,sizeof(sign));
 52     for(i=4;i<=6;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
 53     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 54     // 6 
 55     memset(sign,0,sizeof(sign));
 56     for(i=4;i<=6;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
 57     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 58     // 7
 59     memset(sign,0,sizeof(sign));
 60     for(i=7;i<=9;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
 61     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 62     // 8
 63     memset(sign,0,sizeof(sign));
 64     for(i=7;i<=9;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
 65     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 66     // 9
 67     memset(sign,0,sizeof(sign));
 68     for(i=7;i<=9;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
 69     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
 70 
 71     return 1;
 72 }
 73 void find(){
 74 //    printf("cnt=%d
",cnt++);
 75     if(su==1) return;
 76     if(ifff()==1){
 77         copyy();
 78         su=1;
 79     }
 80     if(su==1) return;
 81     int i,j,k,signi,signj;
 82     int v[10];
 83     int ti1,ti2,tj1,tj2;
 84     for(i=0;i<10;++i) v[i]=0;
 85     for(i=81;i>=1;--i){
 86         if(i%9==0){
 87             if(gird[i/9][9]==0){
 88                 signi=i/9;
 89                 signj=9;
 90                 break;
 91             }
 92         }else{
 93             if(gird[i/9+1][i%9]==0){
 94                 signi=i/9+1;
 95                 signj=i%9;
 96                 break;
 97             }
 98         }
 99     }
100     for(i=1;i<=9;++i){
101         if(gird[signi][i]!=0) v[gird[signi][i]]=1;
102     }
103     for(i=1;i<=9;++i){
104         if(gird[i][signj]!=0) v[gird[i][signj]]=1;
105     }
106 
107     if(signi%3==0){
108         ti1=signi-2;
109         ti2=signi;
110     }else{
111         ti1=(signi/3)*3+1;
112         ti2=(signi/3+1)*3;
113     }
114 
115     if(signj%3==0){
116         tj1=signj-2;
117         tj2=signj;
118     }else{
119         tj1=(signj/3)*3+1;
120         tj2=(signj/3+1)*3;
121     }
122     for(i=ti1;i<=ti2;++i){
123         for(j=tj1;j<=tj2;++j){
124             v[gird[i][j]]=1;
125         }
126     }
127 
128 
129     for(i=1;i<=9;++i){
130         if(su==1) return;
131         if(v[i]==1) continue;
132         gird[signi][signj]=i;
133         find();
134         gird[signi][signj]=0;
135     }
136     return;
137 }
138 
139 int main(){
140     char ss[10][10];
141     int i,j,c;
142     while(~scanf("%d",&c)){
143         getchar();
144         if(c==0) break;
145         while(c--){
146             su=0;
147             for(i=1;i<=9;++i){
148 //                scanf("%s",ss[i]);
149                 gets(ss[i]);
150             }
151             for(i=1;i<=9;++i){
152                 for(j=1;j<=9;++j){
153                     gird[i][j]=ss[i][j-1]-'0';
154                 }
155             }
156             find();
157             for(i=1;i<=9;++i){
158                 for(j=1;j<=9;++j)
159                     printf("%d",res[i][j]);
160                 printf("
");
161             }
162         }
163     }
164     return 0;
165 }
原文地址:https://www.cnblogs.com/symons1992/p/3545278.html