题意:一扫而过,吓我一跳,100*100的数独有木有!dancing link空间都开不下!!再看一眼,= =!只用看当前状态是不是合法的啊。。。
题解:按照数独的定义一个个的检查,突发奇想的问大牛能不能提前判断是否有解,结果被告知唯有dancing link可以检验了。。以前的一道dancing link16*16,就给了5S,我说呢,100*100怎么可能才给2s
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int map[105][105]; 6 bool check1(int n) 7 { 8 for(int i=0;i<n;i++) 9 { 10 bool mark[105]; 11 memset(mark,false,sizeof(mark)); 12 for(int j=0;j<n;j++) 13 { 14 if(map[i][j]!=0&&mark[map[i][j]]) 15 return false; 16 mark[map[i][j]]=true; 17 } 18 } 19 for(int i=0;i<n;i++) 20 { 21 bool mark[105]; 22 memset(mark,false,sizeof(mark)); 23 for(int j=0;j<n;j++) 24 { 25 if(map[j][i]!=0&&mark[map[j][i]]) 26 return false; 27 mark[map[j][i]]=true; 28 } 29 } 30 return true; 31 } 32 bool check2(int m,int n) 33 { 34 for(int i=0;i<n;i+=m) 35 { 36 for(int j=0;j<n;j+=m) 37 { 38 bool mark[105]; 39 memset(mark,false,sizeof(mark)); 40 for(int ii=0;ii<m;ii++) 41 { 42 for(int jj=0;jj<m;jj++) 43 { 44 if(map[i+ii][j+jj]!=0&&mark[map[i+ii][j+jj]]) 45 return false; 46 mark[map[i+ii][j+jj]]=true; 47 } 48 } 49 } 50 } 51 return true; 52 } 53 int main() 54 { 55 int m,n; 56 while(scanf("%d",&m)!=EOF) 57 { 58 n=m*m; 59 for(int i=0;i<n;i++) 60 for(int j=0;j<n;j++) 61 scanf("%d",&map[i][j]); 62 if(check1(n)&&check2(m,n)) 63 printf("CORRECT\n"); 64 else 65 printf("INCORRECT\n"); 66 } 67 return 0; 68 }