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