1201:8003 撬锁者

题目描述

===高科技简报,2002年11月2日06:42 CST ===
“这些物品被锁在克莱恩保险箱里,这个箱子藏在二楼图书馆的一副画背后,得以幸存下来。这种克莱恩保险箱极为罕见的,其中大部分在二战时随着克莱恩和他的工厂被摧毁了。幸运的是,老Brumbaugh从研究中知道克莱恩的秘密,并在去世之前写了下来。克莱恩锁有两个显着特点:它是种组合锁,并且使用字母代替数字,牢牢地刻在门上。总是包含5个到12个不同的大写字母,通常在开头的句子里提到了一个或多个数字。这些大写字母中的5个字母构成的组合便是解锁密码。你选择其中的五个英文字母V,W,X,Y和Z要求满足以下方程,用每个字母在字母表中的顺序位置(A = 1,B = 2 ,...,Z = 26)来代替,如果有一个以上的解决方案,则选字典序中最大的,即在字典中的最后一个会出现。
V - W2 + X3 - Y4 + Z 5 =目标数字
例如,给定的目标1和字母集ABCDEFGHIJKL,一个可能的解决方案是FIECB,因为6 - 92 + 53 - 34 + 25 = 1,在这种情况下,实际上有几个解决方案,最终应该是LKEBA。克莱恩认为它是安全的组合密码,即使你知道这种解锁方法,尝试所有的可能性也会需要几个月的努力。因为在当时计算机并不存在。

输入

===高科技指令,电脑事业部,2002年11月2日12:30 CST ===
要求编程用来找出克莱恩的组合密码。输入包括多组测试数据,每组占一行,每行由一个小于1200万的目标整数构成,空格和至少5个至多12个不同的大写字母构成。以“0 END”表示输入结束。

输出

对于每组测试数据,要求输出克莱恩组合密码,如果没有找到正确的组合,输出“no solution”。

样例输入 复制

1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END

样例输出  复制

LKEBA
YOXUZ
GHOST
no solution
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int xx;string s;
    while(cin>>xx>>s)
    {
        if(xx==0&&s=="END")
        break;
        int a[26];int flag = 0;
        string copy;
        sort(s.begin(),s.end());
        for(int i = s.size()-1;i>=0;i--)
        copy[s.size()-i-1] = s[i];
        for(int i = 0;i<s.size();i++)
        a[i] = copy[i] -'A'+1;
        for(int v = 0;v<s.size();v++)
        {
            for(int w= 0;w<s.size();w++)
            {
                if(a[v]==a[w])
                continue;
                for(int x = 0;x<s.size();x++)
                {
                    if(a[x]==a[w]||a[x]==a[v])
                    continue;
                    for(int y = 0;y<s.size();y++)
                    {
                        if(a[y]==a[x]||a[y]==a[w]||a[y]==a[v])
                        continue;
                        for(int z = 0;z<s.size();z++)
                        {
                            if(a[z]==a[v]||a[z]==a[w]||a[z]==a[x]||a[z]==a[y])
                            continue;
                            if(a[v]-a[w]*a[w]+a[x]*a[x]*a[x]-a[y]*a[y]*a[y]*a[y]+a[z]*a[z]*a[z]*a[z]*a[z]==xx)
                            {
                                flag = 1;
                                printf("%c%c%c%c%c\n",copy[v],copy[w],copy[x],copy[y],copy[z]);
                                break;
                            }
                        }
                        if(flag == 1)
                        break;
                    }
                    if(flag==1)
                    break;
                }
                if(flag==1)
                break;
            }
            if(flag == 1)
            break;
        }
        if(flag==0)
        cout<<"no solution"<<endl;
    }
    return 0;
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值