思路就是最简单的bfs
但是把这个程序里注释掉的那句话不注释就会WA on #6,输出比答案多1。我看讨论区也有大佬提出这个问题,但是没看懂这位大佬说的什么……-_-||
我觉得传送门两端的距离都应该更新啊?为什么只应该更新传送后的距离呢?
有没有神仙帮忙解释一下啊?多谢了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
long long n,m,f[310][310],vis[310][310],x0,y0,x1,y1,d[30][3][3];
const long long dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
char a[310][310];
struct node{
long long x,y;
};
queue <node> q;
int main(){
long long i,j,u,v,k,xx,yy,gx;
cin>>n>>m;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='='){
x0=i;
y0=j;
a[i][j]='.';
}
if(a[i][j]=='@'){
x1=i;
y1=j;
}
if('A'<= a[i][j] && a[i][j]<='Z'){
if(d[a[i][j]-'A'+1][0][0]==0){
d[a[i][j]-'A'+1][0][0]=i;
d[a[i][j]-'A'+1][0][1]=j;
}
else{
d[a[i][j]-'A'+1][1][0]=i;
d[a[i][j]-'A'+1][1][1]=j;
}
}
}
}
memset(f,0x3f,sizeof(f));
memset(vis,0,sizeof(vis));
f[x1][y1]=0;
vis[x1][y1]=1;
q.push(node{x1,y1});
while(!q.empty()){
node now=q.front();
q.pop();
u=now.x;
v=now.y;
for(k=0;k<4;k++){
xx=u+dx[k];
yy=v+dy[k];
if(a[xx][yy]=='.' && !vis[xx][yy]){
f[xx][yy]=f[u][v]+1;
vis[xx][yy]=1;
q.push(node{xx,yy});
}
if('A'<=a[xx][yy] && a[xx][yy]<='Z' && !vis[xx][yy]){
//f[xx][yy]=f[u][v]+1;
vis[xx][yy]=1;
gx=a[xx][yy]-'A'+1;
if(d[gx][0][0]==xx && d[gx][0][1]==yy){
xx=d[gx][1][0];
yy=d[gx][1][1];
f[xx][yy]=f[u][v]+1;
}
else{
xx=d[gx][0][0];
yy=d[gx][0][1];
f[xx][yy]=f[u][v]+1;
}
q.push(node{xx,yy});
}
if(xx==x0 && yy==y0){
break;
}
}
}
cout<<f[x0][y0]<<endl;
return 0;
}