HDOJ 1015 Safecracker

来源:互联网 发布:php 面向接口编程 编辑:程序博客网 时间:2024/05/20 06:53

题意:

    给你一堆字符和一个数target。要你根据题目的

    要求找出符合条件的5个字符v, w, x,y,z

    要求满足 v - w^2+ x^3 - y^4 + z^5 = target

 

分析:

    暴力搜索一下,就可以找到了。只是要注意细节。

   dfs的构造上,参数中要有当前已经找到的字符串,

    已经找了第几个字母了,即搜到的深度depth

   len可要可不要定义成全局的也行。然后记录一下

    已经找到了的字母,防止重复搜索。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int visit[12],flag,target;int mult(char*ans){    int cnt=0,temp=1,op=1;    for(int i=0;i<5;i++)    {        for(int j=1;j<=i+1;j++)        {            temp*=(ans[i]-'A'+1);//细节,注意用的是askii码值来算的        }        cnt+=temp*op;        op*=(-1);        temp=1;    }    return cnt;}void dfs(char *s,char *ans,int depth,int len){    if(depth==5)//定义搜索终止情况,每找到5个都要计算一下看合不合适    {        if(mult(ans)==target)        {            flag=1;        }        return;    }    for(int i=0;i<len;i++)    {        if(!visit[i])//如果当前字母不是已经找过了的字母,就可以搜索        {            ans[depth]=s[i];            visit[i]=1;            dfs(s,ans,depth+1,len);            if(flag)                return;            visit[i]=0;        }    }}bool cmp(char a,char b){    return a>b;}int main(){    char str[13],ans[16];   // freopen("in.txt","r",stdin);    while((scanf("%d%s",&target,str)!=EOF)&&!(target==0&&strcmp(str,"END")==0))    {        memset(visit,0,sizeof(visit));        int len=strlen(str);        sort(str,str+len,cmp);        flag=0;        dfs(str,ans,0,strlen(str));        if(flag==1)        {            for(int i=0;i<5;i++)                printf("%c",ans[i]);            printf("\n");        }        else            printf("no solution\n");    }    return 0;}


0 0
原创粉丝点击