问题简述:给一个密码值,给一个字符串,在字符串给定的范围中找出6个字符使得经过指定的运算(v - w2 + x3 - y4 + z5 = target )之后等于密码值,输出这些字符。
问题分析:这个问题用暴力法来解。
大致思路:
两个函数,一个来计算公式结果值的,一个拿来把输入的字符串中的字母拿来枚举计算结果值的,如果符合输入的target值就输出。
- #include <iostream>
- #include <algorithm>
- #include <string>
- #include <stdio.h>
- using namespace std;
- bool cmp(char a,char b)
- {
- return a > b;
- }
- int calc(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;
- }
- void solve(int target, string& s)
- {
- int n = s.length();
- for(int z=0; z<n; z++) {
- for(int y=0; y<n; y++) {
- if(y == z)
- continue;
- for(int x=0; x<n; x++) {
- if(x == z || x == y)
- continue;
- for(int w=0; w<n; w++) {
- if(w == z || w == y || w == x)
- continue;
- for(int v=0; v<n; v++) {
- if(v == z || v == y || v == x || v == w)
- continue;
- if(calc(s[z]-'A'+1, s[y]-'A'+1, s[x]-'A'+1, s[w]-'A'+1, s[v]-'A'+1) == target) {
- printf("%c%c%c%c%c\n", s[z], s[y], s[x], s[w], s[v]);
- return ;
- }
- }
- }
- }
- }
- }
- printf("no solution\n");
- }
- int main()
- {
- int target;
- string s;
- while(cin >> target >> s && target) {
- solve(target, s);
- }
- return 0;
- }
暴力枚举法。这里是通过下标的枚举来嵌套for循环,从而确定5个公式中的参数的,注意每个参数要不重复,所以每次嵌套中有额外的if语句来限制所取下标。