HDU 1015 Safecracker DFS

来源:互联网 发布:重命名文件夹 linux 编辑:程序博客网 时间:2024/04/28 17:05

    题目是说给出一个数字,然后再给出一行字母,其中字母按字母表的顺序代表相应的数字(A=1, B=2, ..., Z=26),问如何在这一行字母中筛选出5个字母,使得满足等式v - w^2 + x^3 - y^4 + z^5 = target(target就是你输入的数字),组合按字典序大的在前进行排列。既然是要筛选出合理的情况,那就是要从大到小遍历一遍,直接DFS就能过,也没什么特殊的剪枝,注意下在字母输入完之后进行一下排序,一开始没排序结果出来的和样例不一样= =

    然后,放代码吧= =

   

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;char s[105],ans[10];int a[105],res[10];int N,k,t;bool part[105];bool target(int v,int w,int x,int y,int z){    int temp;    temp=v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;    if(temp==N)        return 1;    else        return 0;}int dfs(int step){    int i,j;    if(t==1)        return 0;    if(step==5)    {        if(target(res[0],res[1],res[2],res[3],res[4])==1)        {            t=1;            for(i=0;i<5;i++)            {                ans[i]=res[i]+'A'-1;            }            return 0;        }    }    else    {        for(i=k-1;i>=0;i--)        {            if(!part[i])            {                part[i]=1;                res[step]=a[i];                dfs(step+1);                part[i]=0;            }        }    }    return 0;}int main(){    int i;    while(scanf("%d",&N)!=EOF)    {        scanf("%s",s);        if(N==0&&strcmp(s,"END")==0)            break;        t=0;        memset(part,0,sizeof(part));        k=strlen(s);        for(i=0;i<k;i++)        {            a[i]=s[i]-'A'+1;        }        sort(a,a+k);        dfs(0);        if(t==0)            cout<<"no solution"<<endl;        else            cout<<ans[0]<<ans[1]<<ans[2]<<ans[3]<<ans[4]<<endl;    }    return 0;}


0 0
原创粉丝点击