但是用之前要对其先排序!!!!
do{
for()
if() goto ppp;///当这种情况不合适时跳到下一种情况
ppp:;
}while(next_permutation(q,q+4));
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
const int maxn = 1e6+10;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
string ss="UDLR";
int ans[200];
char s[maxn];
bool solve(){
for(int i = 0 ; i < 4; i++){
ans[ss[i]]=0;
}
int ex,ey;
scanf("%d %d %s",&ex,&ey,s);
for(int i = 0 ; s[i] ; i++)
ans[s[i]]++;
if((ex==0&&ey==0)||(ans[ss[3]]-ans[ss[2]]==ex&&ans[ss[0]]-ans[ss[1]]==ey))
return false;
int id[4]={0,1,2,3};
do{
string cnt="";
int x=0,y=0;
for(int i = 0 ; i < 4 ; i++){
for(int j = 0 ; j < ans[ss[id[i]]]; j++){
cnt+=ss[id[i]];
x+=dx[id[i]];y+=dy[id[i]];
if(x == ex&& y == ey ) goto ppp;
}
}
cout << cnt << endl;
return true;
ppp:;
}while(next_permutation(id,id+4));
return false;
}
int main()
{
int t;scanf("%d",&t);
while(t--){
bool f=solve();
if(!f) printf("Impossible\n");
}
}
2. 结构体重载
struct Point{
double x,y;
Point(){};
Point(double x,double y):x(x),y(y){};
Point operator-(Point b){
return Point(x-b.x,y-b.y);
}
};
3.字符串数字转换
1.对于char 来说
char s[4]="213";
long long n=atoll(s);//转换成 long long
int x=atoi(x);//转换成 int
return 0;
char s[4];
long long x=123;
sprintf(s,"%lld",x);//srpintf(字符串,数据格式,数字)
double x=0.11;
sprintf(s,"%lf",x);
2.对于string来说
string s;
long long n=10000;
s=to_string(n);//将数字串换成string
int n=stoi(s);//转换成int类型
long long x=stoi(s);//转换成long long类型
4.对于逆元时注意的点
G. 鸡哥的雕像
这道题一开始就想成是先累乘,然后对于每一个数,乘上他的逆元,就可以了,但是并没有考虑到如果这个数就是mod那么之后的数就都是0了,不管怎么样输出的都是0,所以可以考虑求一个前缀阶乘,求一个后缀阶乘,然后就避免了对于0的考虑。