这题首先要求是回文的,bfs就能起到构造指令的作用,构造完后跑一边最短路径,就完美结束了
#include<bits/stdc++.h>
using namespace std;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
const int inf=0x3f3f3f3f;
bool mp[55][55];
bool ok[55][55][55][55];
struct node1
{
int xa,ya,xb,yb;
};
struct node2
{
int x,y;
};
char Get()
{
char c=getchar();
while(c!='.'&&c!='#'&&c!='F'&&c!='R')
c=getchar();
return c;
}
void bfs1(int x1,int y1,int x2,int y2)
{
bool vis[55][55];
queue<node1> q;
memset(vis,0,sizeof(vis));
vis[x1][y1]=vis[x2][y2]=true;
q.push((node1){x1,y1,x2,y2});
while(!q.empty())
{
node1 tmp=q.front();
q.pop();
int xa=tmp.xa;
int ya=tmp.ya;
int xb=tmp.xb;
int yb=tmp.yb;
ok[xa][ya][xb][yb]=true;
ok[xb][yb][xa][ya]=true;
for(int i=0;i<4;i++)
{
int x,y,xx,yy;
x=xa+dx[i];
xx=xb+dx[i^1];
y=ya+dy[i];
yy=yb+dy[i^1];
if(vis[x][y]||vis[xx][yy]||!mp[x][y]||!mp[xx][yy])
continue;
vis[x][y]=vis[xx][yy]=true;
q.push((node1){x,y,xx,yy});
}
}
}
int bfs2(int n,int m,int sx,int sy,int ex,int ey)
{
int dis[55][55];
queue<node2> q;
while(!q.empty())
q.pop();
memset(dis,0x3f,sizeof(dis));
dis[sx][sy]=false;
q.push((node2){sx,sy});
while(!q.empty())
{
int x=q.front().x;
int y=q.front().y;
q.pop();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(dis[i][j]==inf&&ok[x][y][i][j])
{
dis[i][j]=dis[x][y]+1;
q.push((node2){i,j});
}
}
}
}
if(dis[ex][ey]<inf)
return dis[ex][ey];
return-1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
memset(ok,0,sizeof(ok));
memset(mp,0,sizeof(mp));
scanf("%d%d",&n,&m);
int sx=0;
int sy=0;
int ex=0;
int ey=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
switch(Get())
{
case'.':
mp[i][j]=true;
break;
case'#':
mp[i][j]=false;
break;
case'F':
mp[i][j]=true;
ex=i;
ey=j;
break;
case'R':
mp[i][j]=true;
sx=i;
sy=j;
break;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j])
{
bfs1(i,j,i,j);
if(mp[i][j+1])
bfs1(i,j,i,j+1);
if(mp[i+1][j])
bfs1(i,j,i+1,j);
}
}
}
printf("%d\n",bfs2(n,m,sx,sy,ex,ey));
}
return 0;
}
来源:zr