社区讨论

无敌状态是可以往回走把走过的地方直接变成'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 条回复,欢迎继续交流。

正在加载回复...