HDOJ1015 Safecracker【DFS排列】

HDOJ1015

题目
在这里插入图片描述
思路
这道题可以抽象为排列问题。
假设有12个字母,要选出5个字母分别代入v-w^2+ x^3 -y^4+ z^5式子里。数学上,这就是一个排列问题,一共有95040种结果。程序上,排列问题可以用dfs解决。

代码

//数组a表示字母对应的int数值
//a[step] = 1表示第step(step范围:1-5)个位置放置的字母是‘A’
//book[i] = 0表示字符串str里下标为i的字符未在式子中使用


#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<cstdio>
using namespace std;

int target;
char str[20];
int a[20], book[20];
bool sortspecial(int x, int y)
{
    return x>y;
}     
bool dfs(int step)
{
    if(step==6)
    {
        int sum = 0;
        int temp = 1;
        for(int i=1;i<6;i++)
        {
            sum+=temp*pow(a[i], i);
            temp*=-1;
        }
        if((int)sum==target)
        {
            for(int i=1;i<6;i++)
            {
                printf("%c", a[i]+'A'-1);
            }
            cout<<endl;
            return true;
        }
        return false; 
    }
    for(int i=0;i<strlen(str);i++)
    {
        if(book[i]==0)
        {
            a[step] = str[i]-'A'+1;
            book[i] = 1;
            if(dfs(step+1))
            {
                return true; 
            }
            book[i] = 0;
        }
    }
    return false;
}
int main()
{
    while(cin>>target&&target!=0)
    {
        memset(book, 0, sizeof(book));
        cin>>str;
        sort(str, str+strlen(str), sortspecial);
        if(dfs(1)==false)
        {
            cout<<"no solution"<<endl;
        }
    }
    return 0;
}

Conclusion
掌握了除迷宫问题以外的dfs的使用,也就是排列组合问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值