这题目是一道求解数独的题目。
做了简单优化,也从网上找了不少数据测试都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\n",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("\n"); 161 } 162 } 163 } 164 return 0; 165 }
原文:http://www.cnblogs.com/symons1992/p/3545278.html