求解密码问题C - RJ503求解密码问题

东北师范大学11/18日算法课在线习题,地址nenuoj
Problem Description
给定一个整数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”.

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

Output
每一行输出相应的密码,当密码不存在是输出“no solution”
Sample Input

1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0

Sample Output

LKEBA
YOXUZ
GHOST
no solution

思想:枚举,把每种情况列举出来。最简单,在数据量大会卡。

#include 

using namespace std;

int main()
{
    int n;
    cin>>n;
    while(n!=0)
    {
    string str;
    cin>>str;
    int l = str.length();

    string max1 ="AAAAA";
    string tep;

    for(int v=l-1;v>=0;v--)
        for(int w=l-1;w>=0;w--)
            for(int x=l-1;x>=0;x--)
                for(int y=l-1;y>=0;y--)
                    for(int z=l-1;z>=0;z--)
    {
       if(v!=w&&v!=x&&v!=y&&v!=z&&w!=x&&w!=y&&w!=z&&x!=y&&x!=z&&y!=z)
       {
       int a=str[v]-64;
       int b=str[w]-64;
       int c=str[x]-64;
       int d=str[y]-64;
       int e=str[z]-64;
       if((a-b*b+c*c*c-d*d*d*d+e*e*e*e*e)==n)
       {
               tep  = str[v];
               tep  += str[w];
               tep  += str[x];
               tep  += str[y];
               tep  += str[z];
               if(tep>max1)
                max1 = tep;
       }
       }
    }
    if(max1=="AAAAA")
        cout<<"no solution"<<endl;
    else
        cout<<max1<<endl;

    cin>>n;
    }

    return 0;
}

你可能感兴趣的:(求解密码问题C - RJ503求解密码问题)