题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6351

HDU-6351 G-Beautiful Now

题目分析:

          任意交换两个数至多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;
	}
}

 

相关文章:

  • 2021-09-04
  • 2022-12-23
  • 2022-02-17
  • 2021-11-19
  • 2021-07-04
  • 2022-12-23
  • 2021-06-05
  • 2021-06-12
猜你喜欢
  • 2021-10-23
  • 2021-09-25
  • 2022-12-23
  • 2021-12-01
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
相关资源
相似解决方案