• 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;
    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    oracle中 start with .. connect by prior.. 用法简介
    Java中com.jcraft.jsch.ChannelSftp讲解
    linux修改系统时间和linux查看时区、修改时区的方法
    map.containsKey
    Struts2中struts.multipart.maxSize配置
    oracle定时器job的使用
    java的System.getProperty()方法可以获取的值
    夜间模式的开启与关闭,父模板的制作
    开始Flask项目
    完成登录与注册页面的前端
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5269641.html
Copyright © 2020-2023  润新知