题目链接:E-Evil Coordinate_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) (nowcoder.com)
题意:在一个图中,一个人从(0,0)进行上下左右行走。有一个地雷点(mx,my)。询问可不可以通过改变行走上下左右的顺序(不改变上下左右走的次数),可以避开雷。如果有多个,输出任意一种,如果没有,输出Impossible
我们可以枚举行走方式,例如枚举到上右下左,那我们就一次性把上全部走完再走右,接着走下,最后走左,当枚举完所有的方式都没有找到答案那么就输出Impossible。
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1e5+10;
int a[4];
int cntl,cntr,cntu,cntd,x,y,flag;
bool check()
{
int nowx=0,nowy=0;
for(int i=0;i<4;i++)
{
if(a[i]==1)
for(int j=1;j<=cntu;j++)
{
nowy++;
if(nowx==x&&nowy==y) return false;
}
else if(a[i]==2)
for(int j=1;j<=cntr;j++)
{
nowx++;
if(nowx==x&&nowy==y) return false;
}
else if(a[i]==3)
for(int j=1;j<=cntd;j++)
{
nowy--;
if(nowx==x&&nowy==y) return false;
}
else
for(int j=1;j<=cntl;j++)
{
nowx--;
if(nowx==x&&nowy==y) return false;
}
}
return true;
}
int main()
{
int T;
cin>>T;
while(T--)
{
a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4;
string s;
flag=0;
scanf("%d%d",&x,&y);
cin>>s;
cntl=0,cntr=0,cntu=0,cntd=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='R') cntr++;
else if(s[i]=='L') cntl++;
else if(s[i]=='U') cntu++;
else cntd++;
}
if((cntu-cntd==y&&cntr-cntl==x)||(x==0&&y==0))
{
puts("Impossible");
continue;
}
do
{
if(check())
{
for(int i=0;i<4;i++)
{
if(a[i]==1)
for(int i=1;i<=cntu;i++)
printf("U");
else if(a[i]==2)
for(int i=1;i<=cntr;i++)
printf("R");
else if(a[i]==3)
for(int i=1;i<=cntd;i++)
printf("D");
else
for(int i=1;i<=cntl;i++)
printf("L");
}
flag=1;
break;
}
}while(next_permutation(a,a+4));
if(!flag) printf("Impossible");
puts("");
}
return 0;
}