#include<bits/stdc++.h>
using namespace std;
char mp[1010][1010];
int sign[1010][1010];
int value[1010][1010];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,k;
struct v{
int x,y,flag,step;
};
int bfs(){
queue<v> q;
v qe={1,1,0,0};
q.push(qe);
while(!q.empty()){
int x=q.front().x,y=q.front().y,flag=q.front().flag,step=q.front().step;
q.pop();
if(x==n&&y==n) return step;
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&mp[tx][ty]!='#'){
if(mp[tx][ty]=='X'&&flag>0){//陷井山但无敌
if(step+1<sign[tx][ty]||flag-1>value[tx][ty]){
//每种情况都加的条件
//保证步数最少且无敌状态时间最长
//即避免来回重复走
sign[tx][ty]=step+1;
value[tx][ty]=flag-1;
v w={tx,ty,flag-1,step+1};
q.push(w);
continue;
}
}
if(mp[tx][ty]=='.'){
if(step+1<sign[tx][ty]||flag-1>value[tx][ty]){
sign[tx][ty]=step+1;
value[tx][ty]=flag-1;
v w={tx,ty,flag-1,step+1};
q.push(w);
continue;
}
}
if(mp[tx][ty]=='%'){
if(step+1<sign[tx][ty]){
sign[tx][ty]=step+1;
value[tx][ty]=k;
v w={tx,ty,k,step+1};
q.push(w);
continue;
}
}
}
}
}
return -1;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
memset(sign,0x3f3f3f3f,sizeof(sign));
memset(value,0,sizeof(value));
cout<<bfs()<<endl;
return 0;
}
P8673 [蓝桥杯 2018 国 C] 迷宫与陷阱
最新推荐文章于 2024-04-16 21:20:30 发布
该代码实现了一个基于广度优先搜索(BFS)的路径寻找算法,处理一个由字符表示的矩阵地图,包含.(可通行),#(障碍),X(陷阱)和%(恢复能量点)。目标是找到从左上角到右下角的最短路径,同时管理一种无敌状态,可以穿越陷阱。算法更新最小步数和无敌状态时间。
摘要由CSDN通过智能技术生成