51,714
社区成员




#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int >PII;
const int maxn=1e5;
const int max1=105;
int dx[4]= {1,0,-1,0},dy[4]= {0,1,0,-1};
int dist[maxn];
vector<int>edges[maxn];
char mp[max1][max1];
bool vis[maxn];
int e[maxn],ne[maxn],h[maxn],w[maxn],idx;
int st,ed;
map<pair<int ,int >,int >mo;
int ans=0x3f3f3f3f,cnt=1;
void add(int a,int b,int c)
{
e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
void dijkstra(int start)
{
memset(dist, 0x3f,sizeof dist); //初始化距离 0x3f代表无限大
memset(vis, false,sizeof vis);
dist[start]=0; //第一个点到自身的距离为0
priority_queue<PII,vector<PII>,greater<PII>>mo;
mo.push({0,start});
while(mo.size())
{
auto t=mo.top();
mo.pop();
int ver=t.second,distance=t.first;
if(vis[ver]) continue;
vis[ver]=1;
for(int i=h[ver];i!=-1;i=ne[i])
{
int j=e[i];
if(dist[j]>w[i]+distance)
{
dist[j]=w[i]+distance;
mo.push({dist[j],j});
}
}
}
for(int dd=0;dd<=3;dd++)
{
ans=min(dist[ed+dd],ans);
}
}
int main()
{
int n,m,i,j,t;
memset(h,-1,sizeof h);
cin>>n;getchar();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>mp[i][j];
int x1=i,x2=j;
if(x1<0||x1>=n||x2<0||x2>=n||mp[x1][x2]=='x') continue;
if(mp[i][j]=='A') st=cnt;
if(mp[i][j]=='B') ed=cnt;
mo[{x1,x2}]=cnt;
cnt+=4;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(mp[i][j]=='x') continue;
for(int k=0;k<4;k++)
{
int x1=i+dx[k],x2=j+dy[k];
if(x1<0||x1>=n||x2<0||x2>=n||mp[x1][x2]=='x') continue;
int d1=mo[{i,j}],d2=mo[{x1,x2}];
for(int dd=0;dd<=3;dd++)
{
int xx=d1+dd,yy=d2+k;
if(dd==k)add(xx,yy,0),add(yy,xx,0);
else add(xx,yy,1),add(yy,xx,1);
}
}
}
}
for(int dd=0;dd<=3;dd++)
{
int bh=st+dd;
dijkstra(bh);
}
if(ans==0x3f3f3f3f){
cout<<-1<<endl;
}
else {
cout<<ans<<endl;
}
return 0;
}