zoukankan      html  css  js  c++  java
  • Safecracker(搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1015
    /*
    题意;
    从所给的一串字符串中选出5个字母假如是(A B C D E)使得A-B2+C3-D4+E5等于前面的数字
    如果有多种答案,就输出字典序最大的五个
    已知A=1 B=2 C=3......................
    */

    include

    include

    include

    int tarNum;
    char secret[25];//存放输入的字符串
    int num[5];//存放的是选出来的5个字符所对应的数字
    int charNum[26];//存放输入某一字符的个数,下标代表哪种字符,charNum[i]代表这种字符有多少个;
    int power(int x,int n)//求x的n次方
    {
    int sum=1;
    for(int i=1; i<=n; i++)
    sum=sum*x;
    return sum;
    }
    int dfs(int n)
    {
    if(n5)
    {
    int sum=power(num[0],1)-power(num[1],2)+power(num[2],3)-power(num[3],4)+power(num[4],5);
    if(sum
    tarNum)return 1;//能找到返回1
    return 0;//否则返回0
    }
    for(int i=25; i>=0; i--)//倒着找找到的第一个就是字典序最大的,找到之后就不用在找了
    {
    if(charNum[i])//如果这个字符没有用完 就继续使用
    {
    charNum[i]--;//当前使用过一次
    num[n]=i+1;//如果不加一那么25代表的就是z了,但是26代表的是z
    if(dfs(n+1))//如果搜到就返回不在搜了,因为你是倒着搜的,搜到的第一个就是最大的
    return 1;
    charNum[i]++;//记得还原,以便下一组用到
    }
    }
    return 0;
    }
    int main()
    {
    while(scanf("%d %s",&tarNum,secret))
    {
    if(tarNum0&&strcmp("END",secret)0)break;
    int length=strlen(secret);
    memset(num,0,sizeof(num));
    memset(charNum,0,sizeof(charNum));
    for(int i=0; i<length; i++)//假如输入 ABBCCDDD
    charNum[secret[i]-'A']++;//charNum[0]=1 charNum[1]=2 charNum[2]=2 charNum[3]=3
    if(dfs(0))
    {
    for(int i=0; i<5; i++)
    {
    printf("%c",num[i]-1+'A');
    }
    printf(" ");
    }
    else printf("no solution ");
    }
    return 0;
    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I作业11
    C语言I作业10
    C语言I作业09
    C语言I作业08
    C语言寒假大作战04
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5269641.html
Copyright © 2011-2022 走看看