您的位置:首页 > Web前端

hdu 1015 Safecracker (dfs)

2016-10-08 18:12 316 查看
题意:输入一个数n,一个字符串,字符串得长度大于等于5小于等于12,且均是大写字母,A 代表 1 B代表 2...
求满足n = A - B ^2 + C^3 - D^4 + E^5 - F^6  ,得5个字母 。
思路:遍历每个字母,用一个数组记录哪些选入字母选入,和选入的次序,因为次序影响结果,由于要找到字典序最大的,先对字符串升序排,然后从字符串最后找,找到的第一个即为答案,用ex变量记录是否存在答案
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
char f[18];
int vis[12]={0},sum,ans[18];
bool ex=false;
int change(char c)
{
return c-'A'+1;
}
void dfs(int n,int k)
{
int len = strlen(f);
if(k==6)
{
sum=pow(ans[1],1)-pow(ans[2],2)+pow(ans[3],3)-pow(ans[4],4)+pow(ans[5],5);
if(sum==n)
{
for(int i=1;i<=5;i++)
{
cout<<(char)(ans[i]+'A'-1);
}
cout<<endl;
ex=1;
}
}
else
{
if(ex)return;
for(int i=len-1;i>=0;i--)
{
if(vis[i]==0)
{
vis[i]=1;
ans[k]=change(f[i]);
dfs(n,k+1);
vis[i]=0;
}
}
}
}

int main()
{
int n;
while(cin>>n&&cin>>f&&n!=0&&f[0]!='E'&&strlen(f)!=3)
{
ex=false;
sort(f,f+strlen(f));
sum=0;
dfs(n,1);
if(ex==false)
{
cout<<"no solution"<<endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: