【基础训练-暴力枚举】Safecracker

问题简述:给一个密码值,给一个字符串,在字符串给定的范围中找出6个字符使得经过指定的运算(v - w2 + x3 - y4 + z5 = target )之后等于密码值,输出这些字符。

问题分析:这个问题用暴力法来解。

大致思路:

两个函数,一个来计算公式结果值的,一个拿来把输入的字符串中的字母拿来枚举计算结果值的,如果符合输入的target值就输出。

  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <string>  
  4. #include <stdio.h>  
  5.   
  6. using namespace std;  
  7.   
  8. bool cmp(char a,char b)  
  9. {  
  10.     return a > b;  
  11. }  
  12.   
  13. int calc(int v,int w,int x,int y,int z)  
  14. {  
  15.     return v - w*w + x*x*x - y*y*y*y + z*z*z*z*z;  
  16. }  
  17.   
  18. void solve(int target, string& s)  
  19. {  
  20.     int n = s.length();  
  21.   
  22.     for(int z=0; z<n; z++) {  
  23.         for(int y=0; y<n; y++) {  
  24.             if(y == z)  
  25.                 continue;  
  26.             for(int x=0; x<n; x++) {  
  27.                 if(x == z || x == y)  
  28.                     continue;  
  29.                 for(int w=0; w<n; w++) {  
  30.                     if(w == z || w == y || w == x)  
  31.                         continue;  
  32.                     for(int v=0; v<n; v++) {  
  33.                         if(v == z || v == y || v == x || v == w)  
  34.                             continue;  
  35.                         if(calc(s[z]-'A'+1, s[y]-'A'+1, s[x]-'A'+1, s[w]-'A'+1, s[v]-'A'+1) == target) {  
  36.                             printf("%c%c%c%c%c\n", s[z], s[y], s[x], s[w], s[v]);  
  37.                             return ;  
  38.                         }  
  39.                     }  
  40.                 }  
  41.             }  
  42.         }  
  43.     }  
  44.     printf("no solution\n");  
  45. }  
  46.   
  47. int main()  
  48. {  
  49.     int target;  
  50.     string s;  
  51.   
  52.     while(cin >> target >> s && target) {  
  53.         solve(target, s);  
  54.     }  
  55.   
  56.     return 0;  
  57. }  


学到的点:

暴力枚举法。这里是通过下标的枚举来嵌套for循环,从而确定5个公式中的参数的,注意每个参数要不重复,所以每次嵌套中有额外的if语句来限制所取下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值