题意:
给你一堆字符和一个数target。要你根据题目的
要求找出符合条件的5个字符v, w, x,y,和z,
要求满足 v - w^2+ x^3 - y^4 + z^5 = target。
分析:
暴力搜索一下,就可以找到了。只是要注意细节。
dfs的构造上,参数中要有当前已经找到的字符串,
已经找了第几个字母了,即搜到的深度depth。
len可要可不要定义成全局的也行。然后记录一下
已经找到了的字母,防止重复搜索。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int visit[12],flag,target;
int mult(char*ans)
{
int cnt=0,temp=1,op=1;
for(int i=0;i<5;i++)
{
for(int j=1;j<=i+1;j++)
{
temp*=(ans[i]-'A'+1);//细节,注意用的是askii码值来算的
}
cnt+=temp*op;
op*=(-1);
temp=1;
}
return cnt;
}
void dfs(char *s,char *ans,int depth,int len)
{
if(depth==5)//定义搜索终止情况,每找到5个都要计算一下看合不合适
{
if(mult(ans)==target)
{
flag=1;
}
return;
}
for(int i=0;i<len;i++)
{
if(!visit[i])//如果当前字母不是已经找过了的字母,就可以搜索
{
ans[depth]=s[i];
visit[i]=1;
dfs(s,ans,depth+1,len);
if(flag)
return;
visit[i]=0;
}
}
}
bool cmp(char a,char b)
{
return a>b;
}
int main()
{
char str[13],ans[16];
// freopen("in.txt","r",stdin);
while((scanf("%d%s",&target,str)!=EOF)&&!(target==0&&strcmp(str,"END")==0))
{
memset(visit,0,sizeof(visit));
int len=strlen(str);
sort(str,str+len,cmp);
flag=0;
dfs(str,ans,0,strlen(str));
if(flag==1)
{
for(int i=0;i<5;i++)
printf("%c",ans[i]);
printf("\n");
}
else
printf("no solution\n");
}
return 0;
}