比赛的时候想写 dfs 时间不够 也不是很会
在lly学长的帮助下 我觉得暴力真香
利用next_permutation(),枚举所有排列,检验,记录即可
代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e6+5;
const int mod=1e9+7;
const double eps=1e-9;
int a[15],pre[15],l,k;
bool check(){
bool vis[15]={0};
int cnt=0;
fo1(i,l){
if(vis[i])
continue;
int cnr=0;
int t=i;
while(!vis[t]){
cnr++;
vis[t]=1;
t=pre[t];
}
cnt+=cnr-1;
if(cnt>k)
return 0;
}
return 1;
}
int main()
{
int t;
string s;
scanf("%d",&t);
while(t--){
cin>>s>>k;
l=s.size();
ll v=0;
fo1(i,l){
a[i]=s[i]-'0';
pre[i]=i;
v=v*10+a[i];
}
ll cmax,cmin;
cmax=cmin=v;
do{
if(a[pre[0]]&&check()){
ll t=0;
fo1(i,l)
t=t*10+a[pre[i]];
cmax=max(cmax,t);
cmin=min(cmin,t);
}
}while(next_permutation(pre,pre+l));
printf("%lld %lld\n",cmin,cmax);
}
return 0;
}