简单bfs(hdu2612)

本文介绍了一种基于广度优先搜索(BFS)的迷宫寻路算法实现,通过两次遍历找到两个角色到达各个目标位置的最短路径,并最终确定最小总步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
//hdu2612,Y,M不能走
int s[210][210],lg[210][210],lg1[210][210];
int n,m;
struct node
{
int x;//hang
int y;//lie
}a,b,d[4050];
int bfs1(int a3,int b3)
{
queue<node> q;
a.x=a3;
a.y=b3;
q.push(a);
while(!(q.empty()))
{
a=q.front();
q.pop();
b.x=a.x+1,b.y=a.y;
if(b.x<n&&lg[b.x][b.y]==0&&s[b.x][b.y]==0)
lg[b.x][b.y]=lg[a.x][a.y]+1,q.push(b);
b.x=a.x-1,b.y=a.y;
if(b.x>=0&&lg[b.x][b.y]==0&&s[b.x][b.y]==0)
lg[b.x][b.y]=lg[a.x][a.y]+1,q.push(b);
b.x=a.x,b.y=a.y+1;
if(b.y<m&&lg[b.x][b.y]==0&&s[b.x][b.y]==0)
lg[b.x][b.y]=lg[a.x][a.y]+1,q.push(b);
b.x=a.x,b.y=a.y-1;
if(b.y>=0&&lg[b.x][b.y]==0&&s[b.x][b.y]==0)
lg[b.x][b.y]=lg[a.x][a.y]+1,q.push(b);
}
return 0;
}
int bfs2(int a4,int b4)
{
queue<node> q;
a.x=a4;
a.y=b4;
q.push(a);
while(!(q.empty()))
{
a=q.front();
q.pop();
b.x=a.x+1,b.y=a.y;
if(b.x<n&&lg1[b.x][b.y]==0&&s[b.x][b.y]==0)
lg1[b.x][b.y]=lg1[a.x][a.y]+1,q.push(b);
b.x=a.x-1,b.y=a.y;
if(b.x>=0&&lg1[b.x][b.y]==0&&s[b.x][b.y]==0)
lg1[b.x][b.y]=lg1[a.x][a.y]+1,q.push(b);
b.x=a.x,b.y=a.y+1;
if(b.y<m&&lg1[b.x][b.y]==0&&s[b.x][b.y]==0)
lg1[b.x][b.y]=lg1[a.x][a.y]+1,q.push(b);
b.x=a.x,b.y=a.y-1;
if(b.y>=0&&lg1[b.x][b.y]==0&&s[b.x][b.y]==0)
lg1[b.x][b.y]=lg1[a.x][a.y]+1,q.push(b);
}
return 0;
}
int main()
{

int a1,b1,a2,b2;
int min;
int i,j,k;
char c;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(lg,0,sizeof(lg));
memset(lg1,0,sizeof(lg1));
memset(s,0,sizeof(s));
a1=a2=b1=b2=0;
k=0;
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<m;j++)
{
scanf("%c",&c);
if(c=='Y')
a1=i,b1=j,s[i][j]=1;
else if(c=='M')
a2=i,b2=j,s[i][j]=1;
else if(c=='@')
{
d[k].x=i;
d[k].y=j;
k++;
}
else if(c=='#')
s[i][j]=1;
}
}
min=INF;
bfs1(a1,b1);
bfs2(a2,b2);
for(i=0;i<k;i++)
{
//printf("%d %d\n",lg[d[i].x][d[i].y],lg1[d[i].x][d[i].y]);
if(lg[d[i].x][d[i].y]+lg1[d[i].x][d[i].y]<min&&lg[d[i].x][d[i].y]!=0&&lg1[d[i].x][d[i].y]!=0)//小心Y或M到不了@的情况
min=lg[d[i].x][d[i].y]+lg1[d[i].x][d[i].y];
}
min=min*11;
printf("%d\n",min);
}
return 0;
}

转载于:https://www.cnblogs.com/cglongge/p/8384689.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值