HDOJ 1015 Safecracker

来源:互联网 发布:ws15知乎 编辑:程序博客网 时间:2024/05/20 07:16

题目链接: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;  //回溯标记要取消}} 


原创粉丝点击