题解(BFS)
2023-07-17 16:32:20
发布于:浙江
289阅读
0回复
0点赞
(先感谢老师告诉我优先队列的用法)
这道题要获取时间最小的路径。
如果直接用队列进行BFS搜索,会出现较大值加下个位置的值,而且随后这个位置会被标记,导致最终值会偏大,用优先队列+结构体运算符重载可以解决这个问题,通过此题。
屑出题的
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct point{
int x,y,step;
bool operator<(const point &n1) const{
return n1.step<step;
}
};
bool vis[21][21];
int n,m,fx[4][2]={-1,0,1,0,0,-1,0,1};
char nums[21][21];
int sx,sy,ex,ey,min_=999999999;
void bfs(point xy){
vis[xy.x][xy.y]=1;
priority_queue<point> q;
q.push({xy.x,xy.y,0});
point xx;
while(!q.empty()){
xx=q.top();
q.pop();
if(xx.x==ex && xx.y==ey){
min_=min(xx.step,min_);
continue;
}
for(int i=0;i<4;i++){
int dx=fx[i][0]+xx.x,dy=fx[i][1]+xx.y;
if(dx>=0 && dx<n && dy>=0 && dy<m && vis[dx][dy]==0 && nums[dx][dy]!='#'){
if(nums[dx][dy]=='.') q.push({dx,dy,xx.step+1});
else q.push({dx,dy,xx.step+(nums[dx][dy]-'0'+1)});
vis[dx][dy]=1;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
cin>>nums[i][j];
if(nums[i][j]=='Z') nums[i][j]='.',sx=i,sy=j;
if(nums[i][j]=='W') nums[i][j]='.',ex=i,ey=j;
}
bfs({sx,sy,0});
if(min_!=999999999) cout<<min_;
else cout<<"IMPOSSIBLE";
return 0;
}
这里空空如也
有帮助,赞一个