一、问题描述
给定一个整数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-92+53-34+25=1,但这样的解可能有多个,最终结果是按字典序最大的那个,所以这里的正确答案为“LKEBA”。
二、输入描述
输入n和str
三、输出描述
输出相应密码,密码不存在时输出“no solution”
例如,11700519 ZAYEXIWOVU: YOXUZ 3072997 SOUGHT: GHOST
1234567 THEQUICKFROG: no solution
四、步骤描述
定义一个1/0数组,判断是否被取到,一个1/0控制变量,定义字符数组,输入后用sort函数排序,之后根据下标一个个遍历判断,被取到的标1,若不符合即重置再遍历。
五、运行结果截图
六、源代码(C++)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int f(int v,int w,int x,int y,int z)
{
v=v-64;
w=w-64;
x=x-64;
y=y-64;
z=z-64;
return (v-w*w+x*x*x-y*y*y*y+z*z*z*z*z);
}
int main()
{
int flaga[15]={'0'},flag=0;
int n,len;
char s[15];
cin>>n;//输入n
scanf("%s",s);//输入str
len=strlen(s);//得到str长度
sort(s,s+len);//按升序排列
for(int i=0;i<len;i++)
{
flaga[i]=1;
for(int j=0;j<len;j++)
{
if(flaga[j]==0)
{
flaga[j]==1;
for(int k=0;k<len;k++)
{
if(flaga[k]==0)
{
flaga[k]=1;
for(int p=0;p<len;p++)
{
if(flaga[p]==0)
{
flaga[p]=1;
for(int q=0;q<len;q++)
{
if((flaga[q]==0) && (f(s[i],s[j],s[k],s[p],s[q])==n))
{
flag=1;
cout<<s[i]<<s[j]<<s[k]<<s[p]<<s[q]<<endl;
}
}
flaga[p]=0;
}
}
flaga[k]=0;
}
}
flaga[j]=0;
}
}
flaga[i]=0;
}
if(flag==0)
{
cout<<"no solution"<<endl;
}
return 0;
}