BFS三维搜索--HDU 1253

三维的BFS简单搜索,TLE了2次,边界问题少了dz的情况,还有注意简单的剪枝,像p.step>=time的情况就得剪去。

学会发散思维,学了二维BFS就要想到三维的又该怎么去写。

 1 #include<iostream>
2 #include<queue>
3 #include<cstring>
4 using namespace std;
5
6 int map[51][51][51];
7 int m[51][51][51];
8 int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
9 int row,col,hig,time,flag;
10 struct point
11 {
12 int x,y,z,step;
13 }pp;
14 queue<point> que;
15
16 int bfs()
17 {
18 int i,j,dx,dy,dz;
19 point p,q;
20 while(!que.empty())
21 {
22 p=que.front();
23 que.pop();
24 if(p.step>=time)
25 continue;
26 if(p.x==row-1&&p.y==col-1&&p.z==hig-1&&p.step<=time)
27 {
28 flag=1;
29 return p.step;
30 }
31 for(i=0;i<6;i++)
32 {
33 dx=p.x+dir[i][0];
34 dy=p.y+dir[i][1];
35 dz=p.z+dir[i][2];
36 if(dx<0||dx>row-1||dy<0||dy>col-1||dz<0||dz>hig-1)
37 continue;
38 if(map[dx][dy][dz]==0&&!m[dx][dy][dz])
39 {
40 m[dx][dy][dz]=1;
41 q.x=dx;q.y=dy,q.z=dz;
42 q.step=p.step+1;
43 que.push(q);
44 }
45 }
46 }
47 }
48
49 int main()
50 {
51 int n,i,j,k,num;
52 scanf("%d",&n);
53 while(n--)
54 {
55 scanf("%d%d%d%d",&row,&col,&hig,&time);
56 memset(m,0,sizeof(m));
57 for(i=0;i<row;i++)
58 for(j=0;j<col;j++)
59 for(k=0;k<hig;k++)
60 scanf("%d",&map[i][j][k]);
61 pp.x=0;
62 pp.y=0;
63 pp.z=0;
64 pp.step=0;
65 m[0][0][0]=1;
66 flag=0;
67 que.push(pp);
68 num=bfs();
69 if(flag==1)
70 printf("%d\n",num);
71 else
72 printf("-1\n");
73 }
74 return 0;
75 }

滴答,滴答,整理好心情再出发,滴答,滴答,还会有人把你牵挂。。。

posted @ 2012-02-18 20:46  hankers  阅读(260)  评论(0编辑  收藏  举报