HDUOJ-1015 Safecracker(深搜)

来源:互联网 发布:淘宝卖假货怎么投诉 编辑:程序博客网 时间:2024/06/06 07:45

深搜

依旧是DFS。题的用语简直不要太美国本土化,尽管公式以及前后两句就足以明白题意,少一句话不明白都不得劲。。半个多小时用来完整翻译。。

解题核心

-深搜函数递归结构,开头判断结束条件
-将字符串排序再搜索,因为需要字典序最大的结果

翻译

Problem Description

=== “高科技简报”, 2002/11/02 06:42 美国中部时间 ===
“该物品被锁在二楼图书馆的一幅画后面的克莱因保险箱里。 克莱因保险箱是很罕见的,大多数都在二战时期随着克莱因和他的工厂损毁掉了。幸运的是老布伦博在他死之前知道了克莱因的秘密并写了下来。克莱因保险箱有两个特点: 一组用字母代替数字的密码,和刻在门上的引文。一个克莱因引文总是包含5到10个大写字母,通常在句子的开头,提到1或多个数字。五种大写字母的组合可以打开保险柜的密码,以适当的形式把它们组合,你就可以得到一个目标。(组合的细节是机密的)为了寻找组合,你必须选5个字母 “v, w, x, y, z”并满足下面的方程,通过字母表中的字母序数(A=1, B=2, …, Z=26)来替代。接着组合是 “vwxyz”。如果有多种解决方案,选择字典序最大的结果”

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

“例如,给定1并且字母设定为ABCDEFGHIJKL,一个可能的解决方案是, “FIECB”,因为 “6 - 9^2 + 5^3 - 3^4 + 2^5 = 1”。 显然对于这组数据有多组解法,正确解是 “LKEBA”。克莱因认为把密码加密并雕刻在门上是安全的,因为即使你知道这个秘密,也可能需要数月的努力去尝试所有的可能性。但是显然计算机那时并不存在。”( 阿塔纳索夫 -> 冯诺依曼: ╮(╯-╰)╭,怪我们咯 )。

=== “高科技简报”, “计算机司”, 2002/11/02 12:30 美国中部时间 ===
“现场设计一个程序来寻找克莱因的密码组合,按部门规定使用标准测试方法,输入一行或多行少于1200万的正整数,一个空格, 然后5~12个大写字母。 结尾用 “0 END”来结束。

对于每个克莱因组合,打破字典关系(。。没找到合适的用语来翻译),如果没有正确的组合,输出’no solution’。
输入输出精确格式如下”

Sample Input

1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END

Sample Output

LKEBA
YOXUZ
GHOST
no solution

AcceptCode

/** Created by zsdostar in 2016/5/2*///v - w^2 + x^3 - y^4 + z^5 = target#include<iostream>#include<string.h>#include<algorithm>using namespace std;bool cmp(char a,char b);bool compare(int v,int w,int x,int y,int z);void dfs(int step);int len;char letter[13];char letterFinal[13];int letterToNum[13];int book[13];int target,flag;int main(){    while(cin>>target>>letter)    {        if(target==0 && strcmp(letter,"END")==0) break;        memset(book,0,sizeof(book));        memset(letterToNum,0,sizeof(book));        flag = 0;        len = strlen(letter);        sort(letter,letter+len,cmp);        dfs(0);        if(flag==0) cout<<"no solution"<<endl;    }}void dfs(int step){    if(flag==1) return;    if(step==5)    {        if(compare(letterToNum[0],letterToNum[1],letterToNum[2],letterToNum[3],letterToNum[4]) )        {          for(int k=0;k<5;k++)              cout<<letterFinal[k];          cout<<endl;          flag=1;        }        return;    }    for(int i=0;i<len;i++)    {        if(book[i] == 0)        {            book[i] = 1;            letterFinal[step] = letter[i];            letterToNum[step] = letterFinal[step]-'A'+1;            dfs(step+1);            book[i] = 0;        }    }}bool compare(int v,int w,int x,int y,int z){    if( (v - w*w + x*x*x - y*y*y*y + z*z*z*z*z) == target)      return true;    return false;}bool cmp(char a,char b){  return a>b;}

函数传参指针神马的都去GoDead吧,全局变量才是真爱( ̄▽ ̄)”

1 0
原创粉丝点击