题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015
解析
DFS入门题目
代码
/*
ID:muller8
Name: 1015 Safecracker
Reference: DFS
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100005
#define INF 1e9
#define LOCAL
int n,len;
char str[15];
char ans[10];
bool visit[15];
bool dfs(int sum, int lab, bool flag){
//sum表示当前的值,lab表示次幂数,flag表示本次是加还是减
if(lab == 6){
if(sum == n){
return true;
}
return false;
}
int i;
int pre = -1; //判重,表示这题貌似用不到
for(i = len-1; i>=0; --i){
if(!visit[i] && (pre<0||str[pre]!=str[i])){
int tmp = flag?1:-1;
for(int j = 0; j<lab; ++j)
tmp *= (str[i]-'A'+1);
ans[lab-1] = str[i];
visit[i] = true;
if(dfs(sum+tmp, lab+1, !flag)) //强剪枝
return true;
visit[i] = false;
}
}
return false;
}
int main(){
while(~scanf("%d", &n)){
getchar();
scanf("%s", str);
if(n == 0){
break;
}
len = strlen(str);
sort(str, str+len);
memset(ans, '\0', sizeof(ans));
memset(visit, false, sizeof(visit));
if(dfs(0, 1, true)){
printf("%s\n", ans);
}
else{
printf("no solution\n");
}
}
return 0;
}