个人觉得找最短路径的就是一个套路问题,但是针对不同题目的处理方法是不同的,但是思想是一致的
我写的是一个比较基本的BFS题目,希望对刚刚接触的人有所帮助。
PS:这是我们学校里比赛的一道题目,比较基础
Description
给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表障碍物不能走,
'A'代表小偷,'B'代表警察,'E'代表出口。每个位置可以向(上,下,左,
右)四个方向走一格,花费一个单位时间,现在给出小偷,警察和出口所在
位置,警察为了捉住小偷会先到出口的位置守株待兔,如果警察在小偷之前
或同时到达出口,或者小偷到达不了出口,输出"No",否则输出"Yes"。
Input
第一行一个整数T(T<=50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表图的行和列
接下来n行,每行为长度为m的字符串,组成一张图
Output
每行输出"Yes"或"No"
Sample Input
2
5 5
....A
##...
E#..B
##...
.....
5 5
A....
.....
B....
...E.
.....
Sample Output
No
No
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#define MAX 505
using namespace std;
struct M
{//需要将数据放到队列里面,所以要用结构体进行储存
int x,y;//记录所在的坐标
int ans;//记录从开始到所在点的步数
}now,next;//now表示最开始的状态
//next表示接下来一步步状态
char mp[MAX][MAX];//储存地图
int vis[MAX][MAX];//标记是否走过的数组
int n,m;//行和列
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
//四个方向遍历的数组
int BFS(int x,int y)
{
queue<M>q;
int l,r,coun;
now.x=x;
now.y=y;
now.ans=0;
//将起点放入队列里面
vis[x][y]=1;//标记为已经走过了
q.push(now);
while(!q.empty()){
l=q.front().x;
r=q.front().y;
coun=q.front().ans;
//取出队首元素
if(mp[l][r]=='E')break;
//判断是否符合退出要求
coun++;
//不符合,则步数加一
//接下来判断是否符合 在范围内 能走 没走过 的要求
for(int i=0;i<4;i++){
next.x=l+dx[i];
next.y=r+dy[i];
next.ans=coun;
if(next.x<0||next.y<0||next.x>=n||next.y>=m)
continue;
if(mp[next.x][next.y]=='#')
continue;
if(vis[next.x][next.y])
continue;
vis[next.x][next.y]=1;
//符合要求,需要将其变为走过,然后入队
q.push(next);
}
q.pop();//弹出队首元素,不断四处遍历找
}
return coun;
}
int main()
{
int T;
cin>>T;
while(T--){
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>mp[i];
int ax=-1,ay=-1,bx=-1,by=-1,flag=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='A'){
ax=i;ay=j;
}
else if(mp[i][j]=='B'){
bx=i;by=j;
}
else if(mp[i][j]=='E'){
int tx,ty;
for(int k=0;k<4;k++){
tx=i+dx[k];ty=j+dy[k];
if(mp[tx][ty]=='A'||mp[tx][ty]=='B'||mp[tx][ty]=='E'){
flag=1;
continue;
}
}
}
}
if(ax!=-1&&bx!=-1&&flag)
break;
}
if(flag==0){
cout<<"NO"<<endl;
continue;
}
int ans1=0,ans2=0;
memset(vis,0,sizeof(vis));
ans1=BFS(ax,ay);
memset(vis,0,sizeof(vis));
ans2=BFS(bx,by);
cout<<ans1<<" "<<ans2<<endl;
if(ans1>=ans2)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
system("pause");
return 0;
}