题意:一扫而过,吓我一跳,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 }