HDU 1015 Safecracker(一道很好的dfs)

题意:输入一个target 和一个字符串 ,字符串每一个字母应1~26个数字,在字符串中找出5个字母能满足v - w^2 + x^3 - y^4 + z^5 = target ,如果能找到输出这5个字符,如果不能输出no solution

题目地址点击打开链接


思路:很容易想到暴力搜索,把每种组合都实验一遍直到找到满足条件的第一组数据

Code:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;

int vis[50],num[50],ans[50],target,len,ok;


int fun(int v,int w,int x,int y,int z)
{
    return v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
}

bool cmp(int x,int y)
{
    if(x>y) return true;
        return false;
}

void dfs(int cnt)				//常规的dfs格式搜索
{
    int i,j;
    if(ok)
        return;		
    if(cnt==5)
    {
        if(fun(ans[0],ans[1],ans[2],ans[3],ans[4])==target)
        {
            ok=1;
            for(j=0;j<5;j++)
                printf("%c",ans[j]+'A'-1);
            printf("\n");
        }
        return;
    }

    for(i=0;i<len;i++)
    {
        if(vis[i])
            continue;
        vis[i]=1;
        ans[cnt]=num[i];
        dfs(cnt+1);
        vis[i]=0;
        if(ok)
            return;
    }
}


int main()
{
    int i;
    string a;					//定义了一个string,输入最好用cin
    while(cin>>target>>a)
    {
        if(target==0&&a=="END")
            break;
        memset(vis,0,sizeof(vis));
        memset(ans,0,sizeof(ans));
        len=a.size();
        for(i=0;i<len;i++)			//将字母转换为对应的值
            num[i]=a[i]-'A'+1;
        sort(num,num+len,cmp);			//从大到小排序
        ok=0;					//ok标记是否找到
        dfs(0);
        if(ok==0)
            printf("no solution\n");
    }
   return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值