首先要判断一下LR、DU有没有交换。一共有三种情况
1. 起点只能向下走
2. 起点只能向右走
3. 起点可以向下或者向右走
之后用bfs找出一条路径,然后去输出就可以了。
#include<bits/stdc++.h>
using namespace std;
const int N=6000;
int dx[]= {0,0,-1,1};
int dy[]= {1,-1,0,0};
int n,m,sx,sy;
char s[1024][1024];
int u[1024][1024];
int ans[100000],cnt;
void bfs(int ex,int ey)
{
memset(u,0xff,sizeof(u));
u[ex][ey]=-2;
queue<int>qx;
queue<int>qy;
qx.push(ex);
qy.push(ey);
while(!qx.empty())
{
int x=qx.front();
int y=qy.front();
qx.pop();
qy.pop();
if(x==sx&&y==sy) break;
for(int i=0; i<4; i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(tx<=0||tx>n||ty<=0||ty>m) continue;
if(u[tx][ty]!=-1||s[tx][ty]=='*') continue;
u[tx][ty]=i;
qx.push(tx);
qy.push(ty);
}
}
cnt=0;
int x=sx;
int y=sy;
while(u[x][y]!=-2)
{
//printf(" %d %d %d",u[x][y],x,y);
ans[cnt++]=u[x][y];
if(u[x][y]==0) x=x,y=y-1;
else if(u[x][y]==1) x=x,y=y+1;
else if(u[x][y]==2) x=x+1,y=y;
else if(u[x][y]==3) x=x-1,y=y;
//printf(" %d %d\n",x,y);
}
}
int main()
{
memset(s,0,sizeof(s));
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%s",s[i]+1);
for(int j=1; j<=m; j++)
{
if(s[i][j]=='F')
{
sx=i;
sy=j;
}
}
}
if(sx==1&&sy==1) return 0;
int x=1,y=1;
int lr=1,du=1;
if((s[2][1]=='*'||n==1)&&(s[1][2]!='*'))
{
puts("R");
fflush(stdout);
cin>>x>>y;
if(y==1)
lr=-1;
while(s[x][y]!='F'&&s[x+1][y]=='*')
{
if(lr==1) puts("R");
else puts("L");
fflush(stdout);
cin>>x>>y;
}
if(s[x][y]=='F') return 0;
puts("D");
fflush(stdout);
cin>>x>>y;
if(x==1) du=-1;
}
else if((s[1][2]=='*'||m==1)&&s[2][1]!='*')
{
puts("D");
fflush(stdout);
cin>>x>>y;
if(x==1)
du=-1;
while(s[x][y]!='F'&&s[x][y+1]=='*')
{
if(du==1) puts("D");
else puts("U");
fflush(stdout);
cin>>x>>y;
}
if(s[x][y]=='F') return 0;
puts("R");
fflush(stdout);
cin>>x>>y;
if(y==1) lr=-1;
}
else
{
puts("R");
fflush(stdout);
cin>>x>>y;
if(y==1)
{
lr=-1;
puts("D");
fflush(stdout);
cin>>x>>y;
if(x==1) du=-1;
}
else
{
if(s[x][y]=='F') return 0;
puts("L");
fflush(stdout);
cin>>x>>y;
puts("D");
fflush(stdout);
cin>>x>>y;
if(s[x][y]=='F') return 0;
if(x==1) du=-1;
}
}
//printf("%d %d\n",x,y);
bfs(x,y);
for(int i=cnt-1; i>=0; i--)
{
if(ans[i]==0||ans[i]==1)
{
if(lr==1)
{
if(ans[i]==1) printf("L\n");
else printf("R\n");
}
else if(lr==-1)
{
if(ans[i]==0) printf("L\n");
else printf("R\n");
}
}
else
{
if(du==1)
{
if(ans[i]==2) printf("U\n");
else printf("D\n");
}
else if(du==-1)
{
if(ans[i]==3) printf("U\n");
else printf("D\n");
}
}
fflush(stdout);
cin>>x>>y;
}
return 0;
}