HDUOJ-1015 Safecracker(深搜)

深搜

依旧是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
#include
#include
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"<b;
}

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

你可能感兴趣的:(HDUOJ-1015 Safecracker(深搜))