[计蒜客(蓝桥杯省赛)]走迷宫2 原创
题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛)
算法标签 宽度优先搜索
题目描述
思路
BFS模板直接找最小值路径。
BFS的思路简而言之是队列找最近的点。
题目代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N=100;
char g[N][N]; //地图
int dist[N][N]; //bool+距离 二合一功能
int n,m;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};//周边,偏移量
int bfs(PII sta,PII end)
{
queue<PII>q;//队列
memset(dist,-1,sizeof dist);//标记为-1,未使用
dist[sta.x][sta.y]=0;//初始化头
q.push(sta);//压入队列
while(q.size())//大小
{
auto t=q.front();//头一个节点
q.pop();//排出头节点
for(int i=0;i<4;i++)//检测周边可行
{
int x=t.x+dx[i],y=t.y+dy[i];//临时位置
if(x<0||x>=n||y<0||y>=m)continue;//越界
else if(dist[x][y]!=-1)continue;//走过
else if(g[x][y]=='#')continue;//是墙
dist[x][y]=dist[t.x][t.y]+1;//更新距离
if(end==make_pair(x,y))return dist[x][y];//到了终点,返回答案
q.push({x,y});//当前值可性,压入队列
}
}
return -1;//未找到返回-1
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>g[i];
PII sta,end;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='S')sta={i,j};
else if(g[i][j]=='T')end={i,j};
cout<<bfs(sta,end);
return 0;
}
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理