题意:输入一个target 和一个字符串 ,字符串每一个字母应1~26个数字,在字符串中找出5个字母能满足v - w^2 + x^3 - y^4 + z^5 = target ,如果能找到输出这5个字符,如果不能输出no solution
题目地址点击打开链接
思路:很容易想到暴力搜索,把每种组合都实验一遍直到找到满足条件的第一组数据
Code:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[50],num[50],ans[50],target,len,ok;
int fun(int v,int w,int x,int y,int z)
{
return v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
}
bool cmp(int x,int y)
{
if(x>y) return true;
return false;
}
void dfs(int cnt) //常规的dfs格式搜索
{
int i,j;
if(ok)
return;
if(cnt==5)
{
if(fun(ans[0],ans[1],ans[2],ans[3],ans[4])==target)
{
ok=1;
for(j=0;j<5;j++)
printf("%c",ans[j]+'A'-1);
printf("\n");
}
return;
}
for(i=0;i<len;i++)
{
if(vis[i])
continue;
vis[i]=1;
ans[cnt]=num[i];
dfs(cnt+1);
vis[i]=0;
if(ok)
return;
}
}
int main()
{
int i;
string a; //定义了一个string,输入最好用cin
while(cin>>target>>a)
{
if(target==0&&a=="END")
break;
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
len=a.size();
for(i=0;i<len;i++) //将字母转换为对应的值
num[i]=a[i]-'A'+1;
sort(num,num+len,cmp); //从大到小排序
ok=0; //ok标记是否找到
dfs(0);
if(ok==0)
printf("no solution\n");
}
return 0;
}