思路
经典BFS题目
首先先建一个结构体que[]
其中:
que[i].x与que[i].y为下标
que[i].t则表示time,即从(1,1)到(x,y)所需要用的时间
BFS就是一层层地搜
举个例子
一颗树
1
2 3
4 5 6 7
8
9
如果是DFS,就应该搜索的顺序是:1-2-4-8-9-5-3-6-7
而BFS的搜索顺序应该是:1-2-3-4-5-6-7-8-9
上面是用树来解释的
而在二维数组中,也是一样的道理
对于每个a[i][j],向四面搜索
分别是:(i+1,j) (i-1,j) (i,j-1) (i,j+1)
而que[i].tt就是从上一个位置的时间+1
而当当前下标就是终点时,输出que[i].t,即从(1,1)走到该位置的时间
另外,我们还要定义一个tou与wei
即头指针与尾指针
其中tou为用来向四边搜索的下标,而wei用来表示存进去的下标
虽然本题中保证有解,但对于无解的题目的判定标准就是tou=wei
【注】:本题有多组数据!!!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e6,M=1e3+1e2;
const ll Maxn=0x3ffffff,Minm=-0x3ffffff;
ll n,m;
ll bx,by;//即 begin x 与 begin y
ll ex,ey;//即 end x 与 end y
ll dx[]={0,0,-1,1};
ll dy[]={-1,1,0,0,};//四个方向,上下左右
char a[M][M];
bool visted[M][M];//用来标记已走的路
bool flag;
struct node
{
ll x,y,t;
}que[N];
void bfs(ll x,ll y)
{
ll tou=0,wei=1;
que[0].x=x,que[0].y=y,que[0].t=0,visted[x][y]=true;
while(tou<wei)
{
for(ll i=0;i<4;i++)
{
ll xx=que[tou].x+dx[i];
ll yy=que[tou].y+dy[i];
ll tt=que[tou].t+1;
if(xx<1||xx>n||yy<1||yy>m||a[xx][yy]=='#'||visted[xx][yy]==true)continue;//边界条件
if(xx==ex&&yy==ey)//找到仙药
{
flag=true;
cout<<tt<<"\n";
return ;//不可以用exit(0);
}
visted[xx][yy]=true;
que[wei].x=xx;
que[wei].y=yy;
que[wei].t=tt;
wei++;
}
tou++;
}
}
signed main()
{
cin>>n>>m;
while(n!=0||m!=0)
{
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@')bx=i,by=j;
if(a[i][j]=='*')ex=i,ey=j;
visted[i][j]=false;
}
}
flag=false;
bfs(bx,by);
if(flag==false)cout<<"-1\n";
cin>>n>>m;
}
}