社区讨论
无敌状态是可以往回走把走过的地方直接变成'x' 去掉vis数组 就是bfs模版
P8673[蓝桥杯 2018 国 C] 迷宫与陷阱参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mkds3q5b
- 此快照首次捕获于
- 2026/01/14 16:48 上个月
- 此快照最后确认于
- 2026/01/17 17:39 上个月
无敌状态是可以往回走,往回走选择穿过陷阱从而选择更短的路径,把走过的地方直接变成'x'
CPP#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
#include <utility>
using namespace std;
int n,k;
typedef pair<pair<int,int>,pair<int,int>>PII;
const int N=1010;
char arr[N][N];
int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int bfs(){
queue<PII>que;
que.push({{0,0},{1,1}});
while(!que.empty()){
PII pii=que.front();
que.pop();
int wudi=pii.first.second;//无敌状态
int step=pii.first.first;//步数
int curx=pii.second.first;
int cury=pii.second.second;
arr[curx][cury]='X';//实现有效去重(非无敌状态无法重复访问)
if(curx==n&&cury==n) return step;
for(int i=0;i<4;i++){
int nextx=curx+dis[i][0];
int nexty=cury+dis[i][1];
if(nextx<1||nextx>=n+1||nexty<1||nexty>=n+1) continue;//越界
if(wudi>0){
if(arr[nextx][nexty]=='.'||arr[nextx][nexty]=='X'){
que.push({{step+1,wudi-1},{nextx,nexty}});
}else if(arr[nextx][nexty]=='%'){//吃无敌道具 ;
que.push({{step+1,k},{nextx,nexty}});
arr[nextx][nexty]='.';//改为普通 防止重复吃无敌道具
}
}else{
if(arr[nextx][nexty]=='.'){
que.push({{step+1,0},{nextx,nexty}});
}else if(arr[nextx][nexty]=='%'){//吃无敌道具
que.push({{step+1,k},{nextx,nexty}});
arr[nextx][nexty]='.';//改为普通 防止重复吃无敌道具
}
}
}
}
return -1;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>arr[i][j];
}
}
cout<<bfs()<<endl;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...