HDU 1253 胜利大逃亡(BFS)

题目链接

这个题,数据很变态。。WA了N次。。。看DISCUSS,过的。

 1 #include <stdio.h>

 2 #include <string.h>

 3 #define N 125001

 4 int p[60][60][60],o[60][60][60];

 5 int qua[N],qub[N],quc[N];

 6 int x[7] = {0,0,0,0,-1,1};

 7 int y[7] = {1,-1,0,0,0,0};

 8 int z[7] = {0,0,1,-1,0,0};

 9 int main()

10 {

11     int i,j,k,a,b,c,t,time,zz,start,end,num;

12     scanf("%d",&t);

13     while(t--)

14     {

15         memset(p,0,sizeof(p));

16         memset(o,0,sizeof(o));

17         scanf("%d%d%d%d",&a,&b,&c,&time);

18         for(i = 0;i <= a-1;i ++)

19         {

20             for(j = 0;j <= b-1;j ++)

21             {

22                 for(k = 0;k <= c-1;k ++)

23                 {

24                     scanf("%d",&p[i][j][k]);

25                     if(p[i][j][k])

26                     o[i][j][k] = 1;

27                 }

28             }

29         }

30         o[0][0][0] = 1;

31         qua[0] = qub[0] = quc[0] = 0;

32         start = end = 0;

33         zz = 0;num = 0;

34         if(a == 1&&b == 1&&c == 1)

35         {

36             printf("0\n");

37             continue;

38         }

39         if(p[a-1][b-1][c-1] == 1)

40         {

41             printf("-1\n");

42             continue;

43         }

44         while(start <= end)

45         {

46             j = 1;

47             if(num > time)

48             break;

49             for(i = start;i <= end;i ++)

50             {

51                 for(k = 0;k <= 5;k ++)

52                 {

53                     if(qua[i]+x[k]>=0&&qua[i]+x[k]<=a-1&&qub[i]+y[k]>=0&&qub[i]+y[k]<=b-1&&quc[i]+z[k]>=0&&quc[i]+z[k]<=c-1)

54                     {

55                         if(!o[qua[i]+x[k]][qub[i]+y[k]][quc[i]+z[k]])

56                         {

57                             o[qua[i]+x[k]][qub[i]+y[k]][quc[i]+z[k]] = 1;

58                             qua[end + j] = qua[i]+x[k];

59                             qub[end + j] = qub[i]+y[k];

60                             quc[end + j] = quc[i]+z[k];

61                             j ++;

62                         }

63                     }

64                 }

65             }

66             start = end + 1;

67             end = end + j - 1;

68             num ++;

69             if(o[a-1][b-1][c-1])

70             {

71                 zz = 1;

72                 break;

73             }

74         }

75         if(zz)

76         printf("%d\n",num);

77         else

78         printf("-1\n");

79     }

80     return 0;

81 }

你可能感兴趣的:(HDU)