您的位置:首页 > 编程语言 > Go语言

poj1248深度搜索简单题

2014-09-09 20:56 260 查看
//题意:总26个字母中给出5到12个大写字母,从中选出5个字母组成vwxyz

//满足条件:v-w^2+x^3-y^4+z^5 = target找出其中最大字典序的vwxyz对应的字母

//思路:很明显是一个搜索问题 考虑深搜找出满足条件的5个字母
//204K 16MS

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAX_N 13

int target;
string ans;
int success;
int path[MAX_N];
int visit[MAX_N];

int power(int a,int n) //计算a^n
{
int i,ans=1;
for(i=1;i<=n;i++)
ans*=a;
return ans;
}
void dfs(string&str,int step,int sum){
if (success)
return;
if (step==6)
{
if (sum == target)
{
for (int i=0;i<5;++i)
ans[i] = visit[i]+'A';
success = 1;
return;
}
else
return;
}
for (int i=str.size()-1;i>=0;--i)
{
if (path[i]==1)
continue;
int num = str[i] - 'A' + 1;
path[i] = 1;
visit[step-1] = num-1;
if (step%2==0)
sum -= power(num,step);
else
sum += power(num,step);
dfs(str,step+1,sum);
if (step%2==0)
sum +=power(num,step);
else
sum -= power(num,step);
path[i] = 0;
}
}

int main(){

while(cin>>target){
string str;
cin>>str;
ans.clear();
ans.resize(5);
success = 0;
memset(path,0,sizeof(path));
memset(visit,0,sizeof(visit));
if (target==0&&str=="END")
break;
sort(str.begin(),str.end());
dfs(str,1,0);
if (!success)
cout<<"no solution"<<endl;
else
cout<<ans<<endl;
}
return 0;
}

代码有点麻烦主要好久没做搜索题了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dp 搜索 dfs algorithm