HDU 1015 Safecracker

来源:互联网 发布:上海淘宝公司 编辑:程序博客网 时间:2024/06/10 02:53

终于做对DFS了。这题就是简单的DFS吧,不过对我而言,我是费了不少力气。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;char s[15];bool isok,visited[15];int len;void dfs(int target,char *ans,int cnt,int id)//cnt用于存储是第几次,一共5次。{    if(isok)        return;    if(target==0&&cnt==5)    {        isok=true;        return;    }    if(cnt>=5)        return;    int t;    for(int i=0;i<len;i++)    {        if(isok)            break;        if(i==id&&visited[i])            continue;        visited[i]=true;//访问过了        ans[cnt]=s[i];        int a=s[i]-'A'+1;        switch(cnt)        {            case 0:t=a;            break;            case 1:t=-a*a;            break;            case 2:t=a*a*a;            break;            case 3:t=-a*a*a*a;            break;            case 4:t=a*a*a*a*a;            break;        }        dfs(target-t,ans,cnt+1,i);        visited[i]=false;//这里要变为没有访问过,否则搜索会有问题    }}bool cmp(char a,char b){    return a>b;}int main(){    int target;    while(scanf("%d%s",&target,s))    {        if(target==0&&strcmp(s,"END")==0)            break;        len=strlen(s);        sort(s,s+len,cmp);//排序,因为题目要求是字典序大的答案        char ans[5];        memset(visited,false,sizeof(visited));        isok=false;        dfs(target,ans,0,0);        if(isok)        {            for(int i=0;i<5;i++)                printf("%c",ans[i]);            printf("\n");        }        else            printf("no solution\n");    }    return 0;}


0 0
原创粉丝点击