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 }
posted @ 2012-08-01 10:55  Naix_x  阅读(169)  评论(0编辑  收藏  举报