题目描述
===高科技简报,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;
}