广度搜索,又叫层搜索(bfs):
一个n*m的迷宫从(1,1)到(n,m)求其最短路程:
当我们遇到求最短路径时马上就应该想到的就是广度搜索;
但是广度搜索,我们应该对数据结构有一定的了解;
#include<iostream>
#include<cstdio>
#include<queue>
//#include<string>
//#include <cstring>
using namespace std;
int n,m;
struct ma{//运用结构体,来把坐标,步数,还有就是生命值表示出来;
int x,y,time1,step;
}now,nextt; //now表示我们当前的,nextt表示我们走到下一步;
int _map[1010][1010];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//依旧是表示回家的4个方向;
int bfs(int x,int y,int time1){
queue<ma>q;//运用队列函数,来把结构体表示;
now.step=0;//初始步数是0;
now.x=x;
now.y=y;
now.time1=time1;通过赋值来表示当前所有状态;
q.push(now);
while(!q.empty()){//当队列不为空时
now=q.front();
q.pop();
for(int i=0;i<4;i++){//进行4个方向的搜索;
int nx=now.x+dir[i][0];
int ny=now.y+dir[i][1];
int ntime1=now.time1-1;
if(ny>=0&&nx>=0&&nx<n&&ny<m&&_map[nx][ny]!=0&&(ntime1>1||ntime1==1&&_map[nx][ny]!=1)){//不超过边界(搜索的边界很重要);我们在生命值还有1的时候,这一步必须要是鼠标,不然就凉凉了;
nextt.x=nx;nextt.y=ny;nextt.time1=ntime1;
nextt.step=now.step+1;
if(_map[nx][ny]==4){//遇到鼠标就满血复活;
nextt.time1=6;
}
if(_map[nx][ny]==3){//到终点我们就打印答案;
return nextt.step;
}
q.push(nextt);//达到条件却没有到达终点,我们就以这一步为位置继续向前;
}
}
}
return -1;//搜索完都没到终点,或死了,就退回-1;
}
using namespace std;
int main()
{ int t,l,r;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>_map[i][j];//打印地图;
if(_map[i][j]==2)//记录我们的起点;
{
l=i;r=j;
}
}
}
int ans=0;
ans=bfs(l,r,6);从起点开始;
cout<<ans<<endl;
return 0;
}
这样写会得到这道题的大部分分;80分;
因为这道题有坑(哭泣),我们要设置的就是步数限制,不然就会mle或者是t了;
所有我们要加入步数限制;
来看新的代码:
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m;
struct ma{//注意这道题开结构体会mle;(我就是在第一个测试点mle了)
int x,y,time1,step;
}now,nextt;
int _map[15][15];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int bfs(int x,int y,int time1){
queue<ma>q;
now.step=0;
now.x=x;
now.y=y;
now.time1=time1;
q.push(now);
while(!q.empty()){
now=q.front();
q.pop();
if(now.step>=n*m)return -1;
for(int i=0;i<4;i++){
int nx=now.x+dir[i][0];
int ny=now.y+dir[i][1];
int ntime1=now.time1-1;
if(ny>=0&&nx>=0&&nx<n&&ny<m&&_map[nx][ny]!=0&&(ntime1>1||ntime1==1&&_map[nx][ny]!=1)){
nextt.x=nx;nextt.y=ny;nextt.time1=ntime1;
nextt.step=now.step+1;
if(_map[nx][ny]==4){
nextt.time1=6;
}
if(_map[nx][ny]==3){
return nextt.step;
}
q.push(nextt);
}
}
}
return -1;
}
using namespace std;
int main()
{ int t,l,r;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>_map[i][j];
if(_map[i][j]==2)
{
l=i;r=j;
}
}
}
int ans;
ans=bfs(l,r,6);
cout<<ans<<endl;
return 0;
}
小伙伴们也可以用数组来完成这道题;一起来讨论区讨论吧;
------小白之作,有问题可以一起来讨论,一起学习;