题目传送门
唉,这道题出的妙啊,本蒟蒻想破头皮也想不出来。
这道题感觉和我之前在cf做的一道题的思考方式(枚举方式)很类似
链接如下
类似题目传送门
怎么做呢?
当时的思路实际上就是想绕过这个地雷。但是这样就会列出很多种情况,这样就非常的耗时耗力,但是看到了一种做法:
利用全排列来枚举每一种情况,比如下上左右,左右上下等,但是每一次选一条道走到黑就能把情况考虑全了?其实答案的走法有很多种,但是我们可以把答案的走法拆分开来,拼接成为,每个方向成为连续的走法(这是众多答案中的一种),这样就可愉快的利用全排列,让每一个方向都一条道走到黑,这样就可以了(题目质量非常高,建议多做做)。这一点建议多理解理解。
同时,全排列函数是STL算法库中的一个,因此需要算法头文件!
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int xx,yy;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int u[4];
int a[]={0,1,2,3};
bool check(){
int aa=0,bb=0;
//aa行,bb列
for(int i=0;i<4;i++){
for(int j=0;j<u[a[i]];j++){
aa+=d[a[i]][0];
bb+=d[a[i]][1];
if(aa==xx&&bb==yy)return false;
}
}
return true;
}
int main(){
int T;
cin>>T;
while(T--){
string s;
cin>>xx>>yy;
int x=0,y=0;
cin>>s;
memset(u,0,sizeof u);
for(int i=0;s[i];i++){
if(s[i]=='U')u[0]++,y++;
else if(s[i]=='D')u[1]++,x++;
else if(s[i]=='R')u[2]++,y--;
else if(s[i]=='L')u[3]++,x--;
}
if(x==xx&&y==yy){
cout<<"Impossible"<<endl;
continue;
}
int ok=1;
for(int i=1;i<24;i++){
/**/
if(check()){
for(int i=0;i<4;i++){
for(int j=0;j<u[a[i]];j++){
if(a[i]==0)cout<<"U";
else if(a[i]==1)cout<<"D";
else if(a[i]==2)cout<<"R";
else if(a[i]==3)cout<<"L";
}
}
ok=0;
break;
}
/**/
next_permutation(a,a+4);//排列函数
}
if(ok){
cout<<"Impossible";
}
cout<<endl;
}
return 0;
}