<原创> hdu 1015 Safecracker

1015

/* hdu 1015 */
#include <stdio.h>

int cto(char c)/* 将大写字符转换为数字 A65 */
{
    return c-64;
}

int len(char *l)/* 统计字符个数 0~n-1 */
{
    int n;
    
    for (n=0;l[n]!='\0';++n)
        ;
    return n;
}

int fact(int a,int n)/* 计算a^n */
{
    int i,s;
    
    for (i=1,s=1;i<=n;++i)
        s*=a;
    
    return s;
}

int calculate(char *s)/* 计算target */
{
    int i,t;
    
    for (i=0,t=0;i<5;++i)
        t+=fact(-1,i)*fact(cto(s[i]),i+1);
    
    return t;
}

void csort(char *l,int n)/* 对字符数组递增排序 */
{
    char c;
    int i,j;
    
    for (i=0;i<n;++i)
    {
        for (j=i+1;j<n;++j)
        {
            if (l[i]>l[j])
            {
                c=l[i];
                l[i]=l[j];
                l[j]=c;
            }
        }
    }
                        
}

void fun(char *l,int n,int t)/* 穷举排列A(n,5) */
{
    int i0,i1,i2,i3,i4;
    char s[5];
    
    for (i0=n-1;i0>=0;--i0)
    {
        s[0]=l[i0];
        
        for (i1=n-1;i1>=0;--i1)
        {
            if (i1==i0)
                continue;
            s[1]=l[i1];
            
            for (i2=n-1;i2>=0;--i2)
            {
                if (i2==i1 || i2==i0)
                    continue;
                s[2]=l[i2];
                
                for (i3=n-1;i3>=0;--i3)
                {
                    if (i3==i2 || i3==i1 || i3==i0)
                        continue;
                    s[3]=l[i3];
                    
                    for (i4=n-1;i4>=0;--i4)
                    {
                        if (i4==i3 || i4==i2 || i4==i1 || i4==i0)
                            continue;
                        s[4]=l[i4];
                                        
                        if (t==calculate(s))
                        {
                            printf("%s\n",s);
                            return ;
                        }
                    }
                }
            }
        }
    }
    printf("no solution\n");
}

int main()
{
    int n,t;
    char l[20];
    
    while (scanf("%d %s",&t,l)!=EOF)
    {
        n=len(l);
        
        if (0==t && 3==n) 
            break;
        
        csort(l,n);
        
        fun(l,n,t);
        
    }
    
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值