当前位置: 代码迷 >> 综合 >> HDU--1015--暴力搜索
  详细解决方案

HDU--1015--暴力搜索

热度:88   发布时间:2023-12-12 06:30:38.0

我们将给你一个数字n和一个字符串,请你从字符串中选出五个字母,字母的大小按照字母表的顺序,比如(A=1, B=2, ..., Z=26)。假设依次选出的字母为v、w、x、y、z 使其满足以下式子

v - w^2 + x^3 - y^4 + z^5 = n

比如:给出一个n = 1 和字符串 ABCDEFGHIJKL,一个可能的结果为FIECB,6 - 9^2 + 5^3 - 3^4 + 2^5 = 1。

请输出满足条件字典序最大的字符串

Input
1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END
Output
LKEBA
YOXUZ
GHOST
no solution

思路一:考虑使用全排列函数;

思路二:直接暴力法,五重循环可以解决;

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#include<cstring>
int n,s;
char a[20];
int cmp(const void*a, const void*b){return *(char*)b-*(char*)a;
}
int pf(int x){return x*x;
}
int main(){while(scanf("%d %s",&n,a)!=EOF){if(n==0&&!strcmp(a,"END"))	break;s=strlen(a);qsort(a,s,sizeof(a[0]),cmp);int v,w,x,y,z; bool ok=false;for(int i=0;i<s;i++){ for(int j=0;j<s;j++){ if(j==i)	continue; for(int k=0;k<s;k++){if(j==k)	continue; for(int f=0;f<s;f++){ if(k==f)	continue; for(int m=0;m<s;m++){ v=a[i]-'A'+1;w=a[j]-'A'+1;x=a[k]-'A'+1;y=a[f]-'A'+1;z=a[m]-'A'+1;int ans=v-pf(w)+x*pf(x)-pf(y)*pf(y)+z*pf(z)*pf(z);if(ans==n){ok=true;printf("%c%c%c%c%c\n",a[i],a[j],a[k],a[f],a[m]);break;}}if(ok) break;}if(ok) break;}if(ok) break;} if(ok) break;} if(!ok)	printf("no solution\n");} 
}