思路
利用BFS的性质求最短路
但是由于存在传送门可能破坏BFS的性质,暂时没有什么证明与HACK(咕咕)
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
struct Node{
pair<int,int> x;
int dis;
};
queue<Node> q;
int map[2000][2000],vis[2000][2000],dis[2000][2000],n,m;
int ansx,ansy,sx[26],sy[26],tx[26],ty[26],Sx,Sy,flag=false;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(void){
q.push((Node){make_pair(Sx,Sy),0 });
while(!q.empty()){
Node x=q.front();
q.pop();
pair<int,int> X = x.x;
if(vis[X.first][X.second])
continue;
vis[X.first][X.second]=true;
if(X.first==ansx&&X.second==ansy){
printf("%d
",x.dis);
return;
}
for(int i=0;i<26;i++){
if(X.first==sx[i]&&X.second==sy[i]){
X.first=tx[i];
X.second=ty[i];
break;
}
else if(X.first==tx[i]&&X.second==ty[i]){
X.first=sx[i];
X.second=sy[i];
break;
}
}
for(int i=0;i<4;i++){
if(X.first+dx[i]>=1&&X.first+dx[i]<=n&&X.second+dy[i]>=1&&X.second+dy[i]<=m)
if((!vis[X.first+dx[i]][X.second+dy[i]])&&(map[X.first+dx[i]][X.second+dy[i]])){
q.push((Node){make_pair(X.first+dx[i],X.second+dy[i]),x.dis+1});
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c;
c=getchar();
while(c!='#'&&c!='.'&&c!='@'&&c!='='&&(c<'A'||c>'Z'))
c=getchar();
if(c=='#')
map[i][j]=0;
else if(c=='.')
map[i][j]=1;
else if(c=='@'){
map[i][j]=1;
Sx=i;
Sy=j;
}
else if(c=='='){
map[i][j]=1;
ansx=i;
ansy=j;
}
else{
map[i][j]=1;
if((!sx[c-'A'])&&(!sy[c-'A'])){
sx[c-'A']=i;
sy[c-'A']=j;
}
else{
tx[c-'A']=i;
ty[c-'A']=j;
}
}
}
bfs();
return 0;
}