HDU-6351 G-Beautiful Now

题目链接:

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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值