hdu 1015(dfs)

hdu1015

Safecracker
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21701 Accepted Submission(s): 11309

Problem Description
=== Op tech briefing, 2002/11/02 06:42 CST ===
“The item is locked in a Klein safe behind a painting in the second-floor library. Klein safes are extremely rare; most of them, along with Klein and his factory, were destroyed in World War II. Fortunately old Brumbaugh from research knew Klein’s secrets and wrote them down before he died. A Klein safe has two distinguishing features: a combination lock that uses letters instead of numbers, and an engraved quotation on the door. A Klein quotation always contains between five and twelve distinct uppercase letters, usually at the beginning of sentences, and mentions one or more numbers. Five of the uppercase letters form the combination that opens the safe. By combining the digits from all the numbers in the appropriate way you get a numeric target. (The details of constructing the target number are classified.) To find the combination you must select five letters v, w, x, y, and z that satisfy the following equation, where each letter is replaced by its ordinal position in the alphabet (A=1, B=2, …, Z=26). The combination is then vwxyz. If there is more than one solution then the combination is the one that is lexicographically greatest, i.e., the one that would appear last in a dictionary.”

v - w^2 + x^3 - y^4 + z^5 = target

“For example, given target 1 and letter set ABCDEFGHIJKL, one possible solution is FIECB, since 6 - 9^2 + 5^3 - 3^4 + 2^5 = 1. There are actually several solutions in this case, and the combination turns out to be LKEBA. Klein thought it was safe to encode the combination within the engraving, because it could take months of effort to try all the possibilities even if you knew the secret. But of course computers didn’t exist then.”

=== Op tech directive, computer division, 2002/11/02 12:30 CST ===

“Develop a program to find Klein combinations in preparation for field deployment. Use standard test methodology as per departmental regulations. Input consists of one or more lines containing a positive integer target less than twelve million, a space, then at least five and at most twelve distinct uppercase letters. The last line will contain a target of zero and the letters END; this signals the end of the input. For each line output the Klein combination, break ties with lexicographic order, or ‘no solution’ if there is no correct combination. Use the exact format shown below.”

Sample Input
1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END

Sample Output
LKEBA
YOXUZ
GHOST
no solution

中文:
安全饼干
时间限制:2000/1000 MS(Java /其他)内存限制:65536/32768 K(Java /其他)
提交总数:21701接受提交:11309

问题描述
===运营商技术简报,2002/11/02 06:42 CST ===
“该物品被锁在二楼图书馆里一幅画后面的一个克莱因保险箱中。克莱因保险箱非常稀少;其中大部分连同克莱因及其工厂在第二次世界大战中被摧毁。幸运的是,研究的老布鲁姆博夫知道克莱因的秘密并在死前将其写下来。克莱因保险柜具有两个显着特征:使用字母代替数字的密码锁以及门上刻有引号的引号克莱因引号始终包含5到12个不同的大写字母,通常在句子的开头,并提到一个或多个数字。五个大写字母构成打开保险箱的组合。通过以适当的方式组合所有数字中的数字,您可以获得数字目标。(构造目标的详细信息要分类的组合,您必须选择满足以下等式的五个字母v,w,x,y和z,其中每个字母都用其在字母表中的序数位置替换(A = 1,B = 2,…,Z = 26)。然后,组合为vwxyz。如果解决方案不止一个,那么组合就是字典上最大的解决方案,即在字典中最后出现的解决方案。”

v-w ^ 2 + x ^ 3-y ^ 4 + z ^ 5 =目标

“例如,给定目标1和字母集ABCDEFGHIJKL,一个可能的解决方案是FIECB,因为6-9 ^ 2 + 5 ^ 3-3 ^ 4 + 2 ^ 5 =1。在这种情况下,实际上有几种解决方案,组合原来是LKEBA。Klein认为在雕刻中对组合进行编码是安全的,因为即使您知道秘密,也可能要花费数月的时间才能尝试所有可能性。但是,那时计算机当然不存在。”

===运算技术指令,计算机部门,2002/11/02 12:30 CST ===

“开发程序以找到Klein组合以准备现场部署。按照部门法规使用标准测试方法。输入内容包括一行或多行包含小于1200万的正整数目标,一个空格,然后至少五个和最多五个行十二个不同的大写字母。最后一行将包含目标零和字母END;这​​表示输入的结尾。对于每行输出,克莱因组合将按词典顺序断开关系,如果没有则为’无解’正确的组合。请使用下面显示的确切格式。”

先对字符串进行排序,再对每个字符都进行遍历即可。

#include<iostream>
#include<string>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1005;
int n;
map<char,int>m;
char s[maxn],temp[maxn],ret[maxn];
int num[maxn],vis[maxn];
int len;
void fun(){
   char c='A';
  for(int i=1;i<=26;i++){
	m[c++]=i;
  }
}
bool check(int a,int b,int c,int d,int f,int ans){
	return a-b*b+c*c*c-d*d*d*d+f*f*f*f*f==ans;
}
void dfs(int cur){
   if(cur==5){
	if(check(num[0],num[1],num[2],num[3],num[4],n)&&strcmp(temp,ret)>0){
		strcpy(ret,temp);
	}
	return ;
   }
   for(int i=0;i<len;i++){
	if(vis[m[s[i]]]==0){
		num[cur]=m[s[i]];
		temp[cur]=s[i];
		vis[m[s[i]]]=1;
		dfs(cur+1);
		vis[m[s[i]]]=0;

	}
   }
}
int main(){
  fun();
   while(1){
	cin>>n>>s;
	if(n==0||strcmp(s,"END")==0)
		break;
	len=strlen(s);
	sort(s,s+len);
	memset(vis,0,sizeof(vis));
	memset(num,0,sizeof(num));
	memset(temp,'\0',sizeof(temp));
	memset(ret,'\0',sizeof(ret));

	dfs(0);
	if(strlen(ret)==0)cout<<"no solution"<<endl;
	else cout<<ret<<endl;
   }
   return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值