题目是说给出一个数字,然后再给出一行字母,其中字母按字母表的顺序代表相应的数字(A=1, B=2, ..., Z=26),问如何在这一行字母中筛选出5个字母,使得满足等式v - w^2 + x^3 - y^4 + z^5 = target(target就是你输入的数字),组合按字典序大的在前进行排列。既然是要筛选出合理的情况,那就是要从大到小遍历一遍,直接DFS就能过,也没什么特殊的剪枝,注意下在字母输入完之后进行一下排序,一开始没排序结果出来的和样例不一样= =
然后,放代码吧= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char s[105],ans[10];
int a[105],res[10];
int N,k,t;
bool part[105];
bool target(int v,int w,int x,int y,int z)
{
int temp;
temp=v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
if(temp==N)
return 1;
else
return 0;
}
int dfs(int step)
{
int i,j;
if(t==1)
return 0;
if(step==5)
{
if(target(res[0],res[1],res[2],res[3],res[4])==1)
{
t=1;
for(i=0;i<5;i++)
{
ans[i]=res[i]+'A'-1;
}
return 0;
}
}
else
{
for(i=k-1;i>=0;i--)
{
if(!part[i])
{
part[i]=1;
res[step]=a[i];
dfs(step+1);
part[i]=0;
}
}
}
return 0;
}
int main()
{
int i;
while(scanf("%d",&N)!=EOF)
{
scanf("%s",s);
if(N==0&&strcmp(s,"END")==0)
break;
t=0;
memset(part,0,sizeof(part));
k=strlen(s);
for(i=0;i<k;i++)
{
a[i]=s[i]-'A'+1;
}
sort(a,a+k);
dfs(0);
if(t==0)
cout<<"no solution"<<endl;
else
cout<<ans[0]<<ans[1]<<ans[2]<<ans[3]<<ans[4]<<endl;
}
return 0;
}
本文介绍了一种通过深度搜索算法(DFS)解决特定数学方程问题的方法。该问题要求从一组按字母顺序排列的字母中挑选五个,将它们对应的数值代入一个预设的数学表达式中,寻找满足特定目标值的组合。文章提供了完整的C++代码实现,并强调了输入字母排序的重要性。
292

被折叠的 条评论
为什么被折叠?



