题意:输入一个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; }