SDUT 2405 Strange Square(DFS)

题目链接

省赛热身赛C题,当时还不会DFS。。。我是直接暴力枚举了9个点,加上个小剪枝,去判重复的操作很重要。。。我在DFS中开一个数组记录在这一层是否搜过这个数。开始忘加Case , 2Y。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[10],o[10],k[10],z;
 4 void dfs(int x)
 5 {
 6     int sum,sum1,i,j,a;
 7     int q[10],w;
 8     if(x > 9)
 9     {
10         sum = k[1] + k[2] + k[3];
11         sum1 = k[1] + k[4] + k[7];
12         if(sum == (k[4] + k[5] + k[6])&&sum == (k[7] + k[8] + k[9]))
13         {
14             if(sum1 == k[2]+k[5]+k[8]&&sum1 == k[3]+k[6]+k[9])
15                 z ++;
16             else
17                 return;
18         }
19         return ;
20     }
21     if(x > 7)
22     {
23         sum = k[1] + k[2] + k[3];
24         if(sum != (k[4] + k[5] + k[6]))
25         return ;
26     }
27     if(x == 9)
28     {
29         sum1 = k[1] + k[4] + k[7];
30         if(sum1 != k[2]+k[5]+k[8])
31         return ;
32     }
33     j = 1;
34     for(i = 1; i <= 9; i ++)
35     {
36         w = 1;
37         for(a = 1;a <= j-1;a ++)
38         {
39             if(q[a] == p[i])
40             {
41                 w = 0;
42                 break;
43             }
44         }
45         if(!o[i]&&w)
46         {
47             q[j] = p[i];
48             j ++;
49             k[x] = p[i];
50             o[i] = 1;
51             dfs(x+1);
52             o[i] = 0;
53         }
54     }
55 }
56 int main()
57 {
58     int i,t,num = 0;
59     scanf("%d",&t);
60     while(t--)
61     {
62         z = 0;
63         num ++;
64         memset(o,0,sizeof(o));
65         memset(k,0,sizeof(k));
66         for(i = 1; i <= 9; i ++)
67             scanf("%d",&p[i]);
68         dfs(1);
69         printf("Case %d: ",num);
70         printf("%d\n",z);
71     }
72     return 0;
73 }
posted @ 2012-07-17 08:29  Naix_x  阅读(192)  评论(0编辑  收藏  举报