#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node{int x,y,m;};
string mp[310];
int vis[310][310];
int n,m,ix,iy,dx,dy,ans=114514;
int idx[4]={1,-1,0,0};
int idy[4]={0,0,1,-1};
queue<node> q;
node go_to(char a,int x,int y){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]==a&&i!=x&&j!=y)return node{i,j};
}
}
}
bool ifgo(int a,int b){
if(a<0||a>=n||b<0||b>=m||mp[a][b]=='#'||vis[a][b])return 0;
return 1;
}
int main(){
//freopen("P1825_2.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
cin>>mp[i];
for(int k=0;k<m;k++){
if(mp[i][k]=='@')ix=i,iy=k;
if(mp[i][k]=='=')dx=i,dy=k;
}
}
cout<<ix<<" "<<iy<<endl;
q.push(node{ix,iy,0});vis[ix][iy]=1;
while(!q.empty()){
node t=q.front();
q.pop();
if(t.x==dx&&t.y==dy){
ans=min(t.m,ans);
}
for(int i=0;i<4;i++){
int x=t.x+idx[i],y=t.y+idy[i];
if(!ifgo(x,y))continue;
vis[x][y]=1;
cout<<x<<" "<<y<<" "<<mp[x][y]<<" "<<t.m+1<<endl;
q.push(node{x,y,t.m+1});
if(mp[x][y]>='A'&&mp[x][y]<='Z'){
node g=go_to(mp[x][y],x,y);
int a=g.x,b=g.y;
if(!ifgo(a,b))continue;
vis[a][b]=1,q.push(node{a,b,t.m+1});
cout<<a<<" "<<b<<" "<<mp[a][b]<<" "<<t.m+1<<endl;
}
}
}
printf("%d",ans);
}
自hack数据
7 5
#####
#BA.@
#.###
#.###
#B..=
#####
#A###