HDOJ 1015 Safecracker

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015

DFS

确定搜索变量为5个参数,然后进行深度优先搜索,并在深度为5时终止搜索,判断状态。

预排序是为了获得字典序大的组合,判重。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
using namespace std;
int t;
string s;
void dfs(int step);
char tmp[5];        //用来存储需要判断的五个变量
bool visit[13];       //对每个字符进行状态标记
bool cmp(char a,char b){
	return a>b;
}
bool ismatch(){
	int re=tmp[0]-pow((double)tmp[1],2)+pow((double)tmp[2],3)-pow((double)tmp[3],4)+pow((double)tmp[4],5);
	return re==t;
}
int flag=0;      //最终状态
int main()
{
	while(cin>>t>>s)
	{
		if(t==0&&s=="END")break;
		memset(tmp,0,sizeof(tmp));
		memset(visit,0,sizeof(visit));
		flag=0;
		int len=s.size();
		for(int i=0;i!=s.size();i++)
			s[i]-=('A'-1);
		sort(s.begin(),s.end(),cmp);	
		dfs(0);
		if(flag)cout<<char(tmp[0]+'A'-1)<<char(tmp[1]+'A'-1)<<char(tmp[2]+'A'-1)<<char(tmp[3]+'A'-1)<<char(tmp[4]+'A'-1)<<endl;
		else cout<<"no solution"<<endl;	 
	}
	return 0;

}
void dfs(int step)
{
	if(step==5)
	{
		if(ismatch())flag=1;
		return ;
	}
	for(int i=0;i!=s.size();i++)
	{
		if(flag)return ;
		if(visit[i])continue; //剪枝,去重复字符,搜素时候找寻不一样的5个字符进行判断
		tmp[step]=s[i];
		visit[i]=1;            
		dfs(step+1);
		visit[i]=0;  //回溯标记要取消
	}
}
 


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值