(还是蛮经典的一道bfs)
显然算法bfs
算法基本上算是bfs的模板了,(模板详见【新知识】队列&bfs【洛谷p1996约瑟夫问题&洛谷p1451求细胞数量】)
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> using namespace std; int r,c; char a1[50]; bool vis[50][50];//用来存储是否走过(显然第一遍走过时用的步数最小qwq) int a[50][50];//存map int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1};//每一步可以走的四个方向 struct amazing{ int x,y; int ans; };//结构体,ans存的是到达这一个点的最小步数qwq amazing fz(int x,int y,int z){ amazing rtn; rtn.x=x; rtn.y=y; rtn.ans=z; return rtn; }//一个类似于构造函数的fz函数 bool pan(int x,int y){ return x>=1&&x<=r&&y>=1&&y<=c&&vis[x][y]==0&&a[x][y]==0; }//判断是否满足可以走的条件 queue<amazing> q; int main(){ scanf("%d%d",&r,&c); for(int i=1;i<=r;i++){ scanf("%s",a1); for(int j=1;j<=c;j++){ if(a1[j-1]=='.') a[i][j]=0; if(a1[j-1]=='#') a[i][j]=1; }//把地图构造成01型 } q.push(fz(1,1,1));//把第一步也就是起点入队 vis[1][1]=1; while(!q.empty()){//bfs模板 amazing h=q.front(); q.pop(); for(int i=0;i<4;i++){ int xx=h.x,yy=h.y,ans=h.ans;//这里之前踩过坑qwq,一定要定义在循环里这一句,要不然会炸 if(pan(xx+dx[i],yy+dy[i])){ xx+=dx[i]; yy+=dy[i]; vis[xx][yy]=1; q.push(fz(xx,yy,ans+1));//走出这一步,ans+1 } if(xx==r&&yy==c){//判断到没到终点 cout<<ans+1<<endl;//因为要算头尾,所以到终点后应输出ans+1 return 0; } } } return 0; }
end-