题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6351
题目分析:
任意交换两个数至多k次求得到的最大的数和最小的数,使用dfs搜索,求最大最小代码基本一样
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string maxStr,minStr;
int len;
void dfs1(int n,int k,string s) //求最小值
{
int min,i;
if(k==0||n==len)
{
if(minStr>s)
{
minStr = s;
}
return;
}
if(n==0) //考虑前导0的情况
{
min = n;
for(i=n+1;i<len;i++)
{
if(s[i]!='0'&&s[i]<=s[min]&&s[i]!=s[n])
{
min = i;
}
}
if(min != n)
{
for(i=n+1;i<len;i++)
{
if(s[i]==s[min])
{
string ss = s;
swap(ss[n],ss[i]);
dfs1(n+1,k-1,ss);
}
}
}
else{
dfs1(n+1,k,s);
}
}
else
{
min = n;
for(i=n+1;i<len;i++)
{
if(s[i]<=s[min]&&s[i]!=s[n])
{
min = i;
}
}
if(min != n)
{
for(i=n+1;i<len;i++)
{
if(s[i]==s[min])
{
string ss = s;
swap(ss[n],ss[i]);
dfs1(n+1,k-1,ss);
}
}
}
else{
dfs1(n+1,k,s);
}
}
return ;
}
void dfs2(int n,int k,string s) //求最大值
{
int max,i;
if(k==0||n==len)
{
if(maxStr<s)
{
maxStr = s;
}
return;
}
if(n==0) //考虑前导0的情况
{
max = n;
for(i=n+1;i<len;i++)
{
if(s[i]!='0'&&s[i]>=s[max]&&s[i]!=s[n])
{
max = i;
}
}
if(max != n)
{
for(i=n+1;i<len;i++)
{
if(s[i]==s[max])
{
string ss = s;
swap(ss[n],ss[i]);
dfs2(n+1,k-1,ss);
}
}
}
else{
dfs2(n+1,k,s);
}
}
else
{
max = n;
for(i=n+1;i<len;i++)
{
if(s[i]>=s[max]&&s[i]!=s[n])
{
max = i;
}
}
if(max != n)
{
for(i=n+1;i<len;i++)
{
if(s[i]==s[max])
{
string ss = s;
swap(ss[n],ss[i]);
dfs2(n+1,k-1,ss);
}
}
}
else{
dfs2(n+1,k,s);
}
}
return ;
}
int main(void)
{
int T;
cin>>T;
getchar();
while(T--)
{
string s;
int k;
cin>>s>>k;
len = s.length();
minStr = s;
dfs1(0,k,s);
cout<<minStr<<" ";
maxStr = s;
dfs2(0,k,s);
cout<<maxStr<<endl;
}
}