hdu - 1240 Nightmare && hdu - 1253 胜利大逃亡(bfs)

时间:2023-03-18 14:19:14

http://acm.hdu.edu.cn/showproblem.php?pid=1240

开始没仔细看题,看懂了发现就是一个裸的bfs,注意坐标是三维的,然后每次可以扩展出6个方向。

第一维代表在第几层。后两维代表行和列。

 #include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct point
{
int x,y,z,step;
bool operator < (const point a) const
{
return step>a.step;
}
};
point t,e;
int n;
char maze[][][];
int used[][][];
int dir[][]={{-,,},{,,},{,-,},{,,},{,,-},{,,}}; void bfs()
{
memset(used,,sizeof(used));
priority_queue<point>que;
que.push(t);
used[t.z][t.x][t.y]=;
while(!que.empty())
{
point s=que.top(); que.pop();
// printf("%d %d %d %d\n",s.z,s.x,s.y,s.step);
if(s.x==e.x&&s.y==e.y&&s.z==e.z) {printf("%d %d\n",n,s.step);return;}
for(int i=;i<;i++)
{
t.x=s.x+dir[i][],t.y=s.y+dir[i][],t.z=s.z+dir[i][];
if(t.x>=&&t.x<n&&t.y>=&&t.y<n&&t.z>=&&t.z<n&&maze[t.z][t.x][t.y]!='X'&&!used[t.z][t.x][t.y])
{
t.step=s.step+;
used[t.z][t.x][t.y]=;
que.push(t);
}
}
}
printf("NO ROUTE\n");
}
int main()
{
// freopen("a.txt","r",stdin);
char s[];
while(~scanf("%s",s))
{
scanf("%d",&n);
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%s",maze[i][j]);
scanf("%d%d%d",&t.y,&t.x,&t.z);
t.step=;
scanf("%d%d%d",&e.y,&e.x,&e.z);
scanf("%s",s);
bfs();
}
return ;
}

http://acm.hdu.edu.cn/showproblem.php?pid=1253

这题用优先队列是超时的,普通队列可以过。

 #include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct point
{
int x,y,z,time;
}s,e;
int maze[][][];
int dir[][]= {{-,,},{,,},{,-,},{,,},{,,-},{,,}}; int main()
{
//freopen("a.txt","r",stdin);
int d,flag;
int a,b,c,t;
queue<point>que;
scanf("%d",&d);
while(d--)
{
scanf("%d%d%d%d",&a,&b,&c,&t);
for(int i=; i<a; i++)
for(int j=; j<b; j++)
for(int k=; k<c; k++)
scanf("%d",&maze[i][j][k]);
while(!que.empty()) que.pop();
s.x=,s.y=,s.z=,s.time=;
flag=;
que.push(s);
maze[s.z][s.x][s.y]=;
while(!que.empty())
{
e=que.front();
que.pop();
//printf("%d %d %d %d\n",e.z,e.x,e.y,e.time);
if(e.z==a-&&e.x==b-&&e.y==c-&&e.time<=t)
{
printf("%d\n",e.time);
flag=;
break;
}
for(int i=; i<; i++)
{
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
s.z=e.z+dir[i][];
if(s.z>=&&s.z<a&&s.x>=&&s.x<b&&s.y>=&&s.y<c&&maze[s.z][s.x][s.y]!=)
{
s.time=e.time+;
if(s.time<=t)
{
maze[s.z][s.x][s.y]=;
que.push(s);
}
}
}
}
if(!flag) printf("-1\n");
}
return ;
}