hdu-1015-深度搜索-Safecracker

来源:互联网 发布:windows tar 打包工具 编辑:程序博客网 时间:2024/06/16 17:33

这道搜索题做了好久QAQ,写出来发现还是不算太难。题目大意就是给你一个target和一个字符串,看看字符串中有没有一个由五个字符组成的字符串使得这五个字符对应的数字(A对应1,B对应2以此类推Z对应26)vwxyz满足v - w^2 + x^3 - y^4 + z^5 = target,如果有多个满足的话输出字典序最大的那个。
说白了就是一个深度搜索为了避免递归深度过大,我先将字符串排好序再从大到小遍历,中间记录一下元素的值,别忘了某些全局变量的值的更新,再弄清搜索的逻辑即可。

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;ll target;int len,ans;int element[6];char s[15];bool used[15];int pow(int x,int y){    int res = 1;    for(int i = 1; i <= y; i++)        res *= x;    return res;}int dfs(int x){    element[ans++] = s[x] -'A' + 1;    if(ans == 5)    {        ll sum = 0;        for(int i = 0; i < 5; i++)        {            if(i%2)                sum -= (long long )pow(element[i], i + 1);            else                sum += (long long)pow(element[i], i + 1);        }        return sum == target;    }    for(int i = len - 1; i >= 0 ; i--)    {        if( !used[i])        {            used[i] = 1;            if(dfs(i))            {                return 1;            }            else            {                used[i] = 0;                ans--;            }        }    }    return 0;}int main(){    int mark;    while(scanf("%I64d",&target) && target )    {        mark = 0;        ans = 0;        memset(used, 0,sizeof(used));        getchar();        scanf("%s",s);        len = strlen(s);        sort(s,s + len);        for(int i = len - 1; i >= 0; i--)        {            used[i] = 1;            if(dfs(i))            {                mark = 1;                break;            }            ans = 0;//别忘了更新            used[i] = 0;        }        if(mark)        {            for(int i = 0; i < 5; i++)                printf("%c",element[i] + 'A' - 1);            printf("\n");        }        else            printf("no solution\n");    }    return 0;}