回朔法 - 求解密码问题

题目

给定一个整数n和一个由不同大写字母组成的字符串str(长度大于5,小于12),每一格字母在字母表中对应有一个序数(A=1,B=2,……,Z=26),从str中选择5个字母构成密码,例如选取的5个字母为v、w、x、y和z,他们要满足:

                                                                   v-{w}^2+{x}^3-{y}^4+{z}^5=n

例如,给定的n=1,,字符串str为“ABCDEFGHIJKL”,一个可能的解释“FIECB”,因为 6-{9}^2+{5}^3-{3}^4+{2}^5=1,但这样的解可以有多个,最终结果是按字典序最大的那个,所以这里的正确答案为“LKEBA”

输入描述

每一行为n和str,以输入n=0结束

输出描述

每一行输出相应的密码,当密码不存在时输出“no solution”

输入样例

1 ABCDEFGHIJKL

11700519 ZAYEXIWOVU

3072997 SOUGHT

1234567 THEQUICKFROG

0

输出样例

LKEBA

YOUXUZ

GHOST

no solution

代码

#include 
#include 
#include 
#include 
using namespace std;

char s[15];
bool vis[15], tag;
int t, len;

int Cal(int y, int w, int v, int x, int z)
{
    v -= 64, w -= 64, x -= 64, y -= 64, z -= 64;
    return (v - w*w + x*x*x - y*y*y*y + z*z*z*z*z);
}

int main()
{
    while(scanf("%d %s", &t, s))
    {
        len = strlen(s);
        if(t == 0 && !strcmp(s,"END")) break;
        tag = true;
        //将可选序列按升序排列
        for(int i = 1; i < len && tag; i++)
        {
            for(int j = 0, tag = false; j < len - i; j++)
            {
                if(s[j] < s[j + 1])
                {
                    swap(s[j], s[j + 1]);
                    tag = true;
                }
            }
        }
        for(int i = 0; i < len; i++) vis[i] = false;
        //若target在值域之外,no solution
        if(Cal(s[0], s[1], s[len - 3], s[len - 2], s[len - 1]) > t || Cal(s[len - 1], s[len - 2], s[2], s[1], s[0]) < t)
            puts("no solution");
        else
        {
            int a, b, c, d, e;
            tag = false;
            for(a = 0; a < len; a++)
            {
                vis[a] = true;
                for(b = 0; b < len; b++)
                {
                    if(!vis[b])
                    {
                        vis[b] = true;
                        for(c = 0; c < len; c++)
                        {
                            if(!vis[c])
                            {
                                vis[c] = true;
                                for(d = 0; d < len; d++)
                                {
                                    if(!vis[d])
                                    {
                                        vis[d] = true;
                                        for(e = 0; e < len; e++)
                                            if(!vis[e] && Cal(s[d], s[b], s[a], s[c], s[e]) == t)
                                            {
                                                tag = true;
                                                goto end;
                                            }
                                        vis[d] = false;
                                    }
                                }
                                vis[c] = false;
                            }
                        }
                        vis[b] = false;
                    }
                }
                vis[a] = false;
            }
            end:
            if(!tag) 
                puts("no solution");
            else
                printf("%c%c%c%c%c\n", s[a], s[b], s[c], s[d], s[e]);
        }
    }
    return 0;
}

以下为我的微信公众号:技术经理的成长

会不定期进行更新,欢迎关注

你可能感兴趣的:(基础算法)