hdu 1015 Safecracker (dfs)

来源:互联网 发布:淘宝手机视频尺寸大小 编辑:程序博客网 时间:2024/03/28 17:34
题意:输入一个数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;}}}

0 0
原创粉丝点击