Mzc和男家丁的游戏

题目链接 https://www.luogu.com.cn/problem/P2298

一道入门的bfs


基本思路:(也是bfs的基本思路)从m点向周围搜索,将每次被搜索的点出队,将周围会被搜索的点依次放入队列中。每走过一个位置就标记此位置已经走过并且计算出走到此点需要的步数,直到找到目标点。


 

放AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;//行、列
 4 int mx,my;//起始位置,即m的坐标
 5 int ans;//最后的和,即最短移动次数
 6 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//对横、纵坐标搜索
 7 int dis[2010][2010];//distance表示距离
 8 char ch[2010][2010];//储存矩阵
 9 bool vis[2010][2010];//标记数组
10 struct node
11 {
12     int x;
13     int y;
14 };
15 int bfs(int bx,int by)
16 {
17     vis[bx][by]==true;//标记此点
18     queue<node>q;
19     node start,next;
20     start.x=bx;
21     start.y=by;
22     q.push(start);
23     while(!q.empty())
24     {
25         start=q.front();
26         q.pop();//出队
27         if(ch[start.x][start.y]=='d')//如果遇到d
28             return dis[start.x][start.y];//返回此点值
29         for(register int i=0;i<4;i++)
30         {
31             next.x=start.x+dx[i];//向下一位置搜索
32             next.y=start.y+dy[i];
33             if(next.x<=0||next.x>n||next.y<=0||next.y>m)//避免越界
34                 continue;
35             if(vis[next.x][next.y]==true||ch[next.x][next.y]=='#')//如果此点已经走过或有障碍物
36                 continue;
37             dis[next.x][next.y]=dis[start.x][start.y]+1;
38             vis[next.x][next.y]=true;//标记此点
39             q.push(next);//将下一个方向入队
40         }
41     }
42     return -1;//已经搜索完所有点但无法找到d
43 }
44 int main()
45 {
46     ios::sync_with_stdio(false);
47     cin>>n>>m;
48     for(register int i=1;i<=n;i++)
49     {
50         for(register int j=1;j<=m;j++)
51         {
52             cin>>ch[i][j];
53             if(ch[i][j]=='m')
54             {mx=i; my=j;}
55         }
56     }
57     ans=bfs(mx,my);
58     if(ans==-1) cout<<"No Way!"<<endl;
59     else cout<<ans<<endl;
60     return 0;
61 }

 

posted @ 2022-03-28 21:40  爱吃虾滑  阅读(28)  评论(0编辑  收藏  举报