您的位置:首页 > Web前端

ZOJ 1403 Safecracker

2013-04-03 21:05 435 查看
简单的回溯搜索题,枚举每5个字母的120中组合

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

vector<char>stak,ans;
int len,target;
char str[15];

void backtracking(int curi){
if(stak.size()==5){
vector<char>temp=stak;
do
{
int a=temp[0]-'A'+1,b=temp[1]-'A'+1,c=temp[2]-'A'+1,d=temp[3]-'A'+1,e=temp[4]-'A'+1;
if(a-b*b+c*c*c-d*d*d*d+e*e*e*e*e==target){
if(temp>ans)ans=temp;
}
} while (prev_permutation(temp.begin(),temp.end()));//枚举每一种排列
return;
}else if(curi>=len)return;
stak.push_back(str[curi]);
backtracking(curi+1);
stak.pop_back();
backtracking(curi+1);
}
int main(){
while (scanf("%d %s",&target,str)==2)
{
if(target==0&&strcmp(str,"END")==0)break;
stak.clear(),ans.clear();

len=strlen(str);

sort(str,str+len,greater<char>());

backtracking(0);

if(ans.size()){
for (int i=0;i<ans.size();++i)
{
printf("%c",ans[i]);
}
printf("\n");
}else printf("no solution\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: