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 }

 

你可能感兴趣的:(poj)