MLE求调
  • 板块学术版
  • 楼主Rice_Demon_King
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/19 13:20
  • 上次更新2025/1/19 13:46:27
查看原帖
MLE求调
680022
Rice_Demon_King楼主2025/1/19 13:20

题目描述

小A是个小术士,他很喜欢单挑BOSS。单挑BOSS是指在N×M的矩形(N,M≤100),上面遍布了小怪和传送门,其中l表示有小怪,O表示无小怪,大写字母表示传送门,传送门是一对相同的大写字母,如遇到一个大写A(第一次必须传送)则马上可以到达另一个大写A的位置(次数不限,但每次进入传送点只传送过去,不会直接传送回来,数据保证每个传送门有且仅有相对应的另一个传送门)。小A在左上方(1,1)出发,BOSS躲在右下方(N,M)。小A绝不会在小怪身上浪费时间(当然是绕开他们),并且想通过传送门尽快到达BOSS身边。

代码

#pragma GCC optimize( 2 )
#include<bits/stdc++.h>
#define ll long long
#define For(i,j,k) for(int i=j;i<=k;i++)
#define dFor(i,j,k) for(int i=j;i>=k;i--)
const int MAXN=101;
using namespace std;
int n,m;
bool vis[MAXN][MAXN];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
char tmap[MAXN][MAXN];
unordered_map<int,int> mpx,mpy;
queue<int> qx,qy,qstep;
void bfs(){
	qx.push(1),qy.push(1),qstep.push(0);
	while(!qx.empty()){
		int prex=qx.front(),prey=qy.front(),prestep=qstep.front();
		qx.pop(),qy.pop(),qstep.pop();
		For(i,0,3){
			int nx=prex+dx[i],ny=prey+dy[i],nstep=prestep+1;
			if(nx<1||ny<1||nx>n||ny>m) continue;
			if(vis[nx][ny]==1) continue;
			if(tmap[nx][ny]=='1') continue;
			if(nx==n&&ny==m){
				cout<<nstep;
				exit(0);
			}
			if(tmap[nx][ny]=='0') vis[nx][ny]=1,qx.push(nx),qy.push(ny),qstep.push(nstep);
			else qx.push(mpx[nx*m+ny]),qy.push(mpy[nx*m+ny]),qstep.push(nstep);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	For(i,1,n)
		For(j,1,m)
			cin>>tmap[i][j];
	For(i,1,n){
		For(j,1,m){
			if(tmap[i][j]>='A'&&tmap[i][j]<='Z'){
				For(ii,1,n){
					For(jj,1,m){
						if(ii==i&&jj==j) continue;
						if(tmap[ii][jj]==tmap[i][j]){
							mpx[i*m+j]=ii,mpy[i*m+j]=jj;
						}
					}
				}
			}
		}
	}
	bfs();
	cout<<"No Solution.";
	return 0;
}
2025/1/19 13:20
加载中...