时隔多年,终于搞定
思路:看代码
#include<cstdio>
#include<cstring>
#include<cstdlib>
int n,m,l,r;
char map[70][70];
char cur[70][70];
int X,Y;
struct my
{
int x,y;
};
int pre[70][70];
my q[10000];
long long ans=0;
bool b[70][70];
char c[100];
int cc;
long long get(int x,int y)
{
if (x==1 && y==1)
return 0;
if (pre[x][y]==1)
return 1+3*get(x-1,y);
else
return 2+3*get(x,y-1);
}
void p(int x,int y)
{
if (x==1 && y==1)
{
cc=0;
return;
}
if (pre[x][y]==1)
p(x-1,y),c[cc++]='D';
else
p(x,y-1),c[cc++]='R';
}
void bfs()
{
int i,j,k;
for (i=1;i<=X+1;i++)
for (j=1;j<=Y+1;j++)
cur[i][j]='.',b[i][j]=false;
int ii=1,jj=1;
int N=X+1,M=Y+1;
while (ii+X<=n && jj+Y<=m)
{
/*
for (i=ii;i<=ii+X;i++)
for (j=ii;j<=ii+Y;j++)
if (map[i][j]=='X')
cur[i-ii+1][j-jj+1]='X',cout<<"here"<<i<<' '<<j<<' '<<ii<<' '<<jj<<endl;
*/
for (i=1;i<=N;i++)
for (j=1;j<=M;j++)
if (map[i+ii-1][j+jj-1]=='X')
cur[i][j]='X';
if (cur[X+1][Y+1]=='Y')
return;
ii+=X;
jj+=Y;
}
if (ii!=n && jj!=m)
for (i=1;i<=N;i++)
for (j=1;j<=M;j++)
if (i+ii-1<=n && j+jj-1<=m && map[i+ii-1][j+jj-1]=='X')
cur[i][j]='X';
int start=0,end=1;
q[0].x=q[0].y=1;
if (cur[1][1]=='X')
return;
while (start<end)
{
if (q[start].x==N && q[start].y==M)
{
if (!ans)
ans=get(q[start].x,q[start].y),p(N,M);
else
{
long long cc=get(q[start].x,q[start].y);
if (cc<ans)
{
ans=cc;
p(q[start].x,q[start].y);
}
}
return;
}
if (q[start].x<N && cur[q[start].x+1][q[start].y]!='X' && !b[q[start].x+1][q[start].y])
{
b[q[start].x+1][q[start].y]=true;
q[start].x++;
q[end++]=q[start];
q[start].x--;
pre[q[start].x+1][q[start].y]=1;
}
if (q[start].y<M && cur[q[start].x][q[start].y+1]!='X' && !b[q[start].x][q[start].y+1])
{
b[q[start].x][q[start].y+1]=true;
q[start].y++;
q[end++]=q[start];
pre[q[start].x][q[start].y]=2;
}
start++;
}
}
void f(int num)
{
int i,j,x,y,temp=num>n?n:num;
for (x=0;x<=temp;++x)
{
y=num-x;
if (y>m)
continue;
X=x;
Y=y;
bfs();
}
}
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
int t;
scanf("%d",&t);
//memset(map,'X',sizeof(map));
while (t--)
{
ans=0;
scanf("%d%d%d%d",&n,&m,&l,&r);
getchar();
for (i=1;i<=n;++i)
scanf("%s",map[i]+1);
for (i=l;i<=r;i++)
{
f(i);
if (ans)
break;
}
c[i]='\0';
puts(c);
}
return 0;
}