POJ 1659 Frogs' Neighborhood(DFS)

题目链接

这个题1Y,还是想了几个剪枝63ms,如果直接去暴力的10*10的有点大,因为这相当于无向图,只须枚举一半就可以,也就是45个点,其实还是有点悬的,再加一个剪枝,中间加入判断把不符合情况的,直接淘汰。实习回来的第一个题,DFS调试了半天。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[101][101],o1[11],o2[11],z,n;
 4 void dfs(int x,int y)
 5 {
 6     int r,c,i,j;
 7     if(z) return ;
 8     if(o2[x] > o1[x]||o2[y] > o1[y])
 9         return ;
10     if(x > n)
11     {
12         for(i = 1; i <= n; i ++)
13         {
14             if(o2[i] != o1[i])
15                 break;
16         }
17         if(i == n+1)
18         {
19             z = 1;
20             printf("YES\n");
21             for(i = 1; i <= n; i ++)
22             {
23                 for(j = 1; j <= n; j ++)
24                 {
25                     if(j == 1)
26                         printf("%d",p[i][j]);
27                     else if(j > i)
28                         printf(" %d",p[j][i]);
29                     else
30                         printf(" %d",p[i][j]);
31                 }
32                 printf("\n");
33             }
34         }
35         return;
36     }
37     if(y+1 >= x)
38     {
39         r = x+1;
40         c = 1;
41     }
42     else
43     {
44         r = x;
45         c = y+1;
46     }
47     o2[x] ++;
48     o2[y] ++;
49     p[x][y] = 1;
50     dfs(r,c);
51     p[x][y] = 0;
52     o2[x] --;
53     o2[y] --;
54     dfs(r,c);
55 }
56 int main()
57 {
58     int i,t;
59     scanf("%d",&t);
60     while(t--)
61     {
62         scanf("%d",&n);
63         z = 0;
64         memset(p,0,sizeof(p));
65         memset(o2,0,sizeof(o2));
66         for(i = 1; i <= n; i ++)
67             scanf("%d",&o1[i]);
68         dfs(2,1);
69         if(!z)
70             printf("NO\n");
71         if(t != 0)
72         printf("\n");
73     }
74 }

 

posted @ 2012-07-08 15:58  Naix_x  阅读(166)  评论(0)    收藏  举报