POJ 3435

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

你可能感兴趣的:(poj)