hdu1015--dfs搜索
/*题目的要求就是给你一串大字的字母,让你从中选取5个,v - w^2 + x^3 - y^4 + z^5 = target,并且要满足这个公式,找到最大的字典序,并输出*/#include<iostream>#include<algorithm>#include<string.h>#include<cmath>using namesp...
·
/*题目的要求就是给你一串大字的字母,让你从中选取5个,v - w^2 + x^3 - y^4 + z^5 = target,并且要满足这个公式,找到最大的字典序,并输出*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>
using namespace std;
#define clean(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
bool cmp(char a,char b)
{
return a>b;
}
string str;
int flag;ll t;
bool sign[20]; //这里用来标记
int s[6]; //存搜索过程中的字母,转化为整型
void dfs(int k)
{
if(flag) return ; //找到了直接return
int i;
if(k==5)
{
if(s[0]-s[1]*s[1]+s[2]*s[2]*s[2]-s[3]*s[3]*s[3]*s[3]+s[4]*s[4]*s[4]*s[4]*s[4]==t)
flag=1;
return ;
}
for(i=0;i<str.size();i++)
{
if(flag) return ;
if(!sign[i])
{
sign[i]=true;
s[k]=str[i]-'A'+1;
dfs(k+1);
sign[i]=false;
}
}
return;
}
int main()
{
while(cin>>t>>str,t!=0||str!="END")
{
sort(str.begin(),str.end(),cmp);//字母进行降序排列,这样第一次搜索到就能保证是字典的最大序列
clean(sign,false);
flag=0;
dfs(0); //直接dfs
if(flag)
{
for(int i=0;i<5;i++)
printf("%c",s[i]-1+'A');
cout<<endl;
}
else
cout<<"no solution\n";
}
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)