zoj 1403 Safecracker(枚举)

一道枚举的题目,根据公式,五重循环....
有个优化剪枝的地方的五个未知量不可能相等。可以略去不少的运算
pass:一开始WR的原因是pow函数的使用,来回用到强制类型转换来改变数据的类型使得出现数据的精度误差,没有AC。T-T
然后采用最原始的连乘式过了......
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
bool cmp(int a,int b)
{
    return a > b;
}
int main()
{
    void judge(int len,int value[],int key);
    int n,len;
    char data[15];
    int value[15];
    while(cin>>n>>data && n && strcmp("END",data))
    {
       // cout<<n<<" "<<data<<endl;
        len = strlen(data);
        for(int i = 0 ; data[i] != '\0' ; i++)
        {
            value[i] = data[i] - 'A' + 1;
        }
        sort(value,value+len,cmp);
       /* for(int i = 0 ; i < len ; i++)
        {
            cout<<value[i]<<" ";
        }*/
        judge(len,value,n);
    }
    return 0;
}
void judge(int len,int value[],int key)
{
    for(int a = 0 ; a < len  ; a++)
    {
        for(int b = 0 ; b < len ; b++)
        {
            if(a!=b)
               {
                for(int c = 0 ; c  < len   ; c++)
                {
                if(a!=c && b!=c)
                {
                    for(int d = 0 ; d < len  ; d++)
                    {
                        if(a!=d && b!=d && c!=d)
                        {
                            for(int e = 0 ; e < len ; e++)
                            {
                                if(a!=e && b!=e && c!=e && d!=e)
                                {
                                    if(value[a] - value[b]*value[b] + value[c]*value[c]*value[c] - value[d]*value[d]*value[d]*value[d] + value[e]*value[e]*value[e]*value[e]*value[e] == key)
                                    {
                                        printf("%c%c%c%c%c\n",value[a]+'A'-1,value[b]+'A'-1,value[c]+'A'-1,value[d]+'A'-1,value[e]+'A'-1);
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
                }
               }
        }
    }
    printf("no solution\n");
}


/*将字母转化为对应的数字,套取公式进行判断。*/

/*字典序输出最后一项的技巧*//*将字母转化过来的数字降序进行排列,这样得到的第一组情况的解即为字典序下的最后一组解*/

/*特殊限制。每个解的五个值不相等,可以减少枚举情况*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值