题解报告:hdu 1015 Safecracker
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."
“该物品被锁在二楼图书馆一幅油画后面的克莱恩保险柜中,克莱因保险柜非常罕见,其中大部分与克莱恩及其工厂一起在二战时被摧毁。幸运的是,老布鲁博从研究中知道克莱因在他去世前写下他们的秘密,一个克莱因保险箱有两个显着特点:一个使用字母而不是数字的组合锁,以及一扇刻在门上的刻字引号Klein引用总是包含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。在这种情况下实际上有几个解决方案, Klein认为在雕刻中对组合进行编码是安全的,因为即使你知道秘密也需要数月的努力来尝试所有的可能性,但当然电脑当时并不存在。”
#include<bits/stdc++.h>
using namespace std;
char s[],t[],g[];//s是输入的一串,t是临时保存字母,g是存放最终的5个字母(最大字典序)
int target,len,a[];//a数组来保存字母对应的数字
bool vis[];
bool isobj(int v,int w,int x,int y,int z,int tar){
if(v - w*w + x*x*x - y*y*y*y + z*z*z*z*z == tar) return true;
else return false;
}
void dfs(int k)
{
if(k==){//边界条件
if(isobj(a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],target) && strcmp(t,g)>)
strcpy(g,t);//与目标相等时,还要按照字典序较大的输出
return;//回溯,返回上一层
}
for(int i=;i<len;i++){//遍历字符串
if(!vis[s[i]-'A']){//如果当前字母没有访问
t[k]=s[i];//先存到t数组中
vis[s[i]-'A']=true;//并标记为暂时的访问过
dfs(k+);//从每个当前位置进行深搜
vis[s[i]-'A']=false;//不满足条件的把原来标记的记为未访问过(回溯)
}
}
}
int main()
{
for(int i=;i<;i++)a[i]=i+;//对26个字母进行编号赋值
while(cin>>target>>s && (target||strcmp(s,"END"))){
memset(vis,false,sizeof(vis));//初始化为假值,表示都未访问过
memset(g,'\0',sizeof(g));//全部赋为'\0',便于拷贝和整体输出
memset(t,'\0',sizeof(t));
len=strlen(s);//目标字符串的长度
dfs();//从第0个目标字符开始深搜
if(strlen(g)==)cout<<"no solution"<<endl;//如果g的长度仍是0,则没有解
else cout<<g<<endl;//否则输出g字符串
}
return ;
}
以上是深搜目标字符串,找出其中最大字典序字符串,但其实我们只需要将目标字符串中的字母进行降序排列,然后深搜找到第一个满足表达式的字符串,即为最大字典序字符串。AC解法二代码:
#include<bits/stdc++.h>
using namespace std;
char s[],t[];//s是输入的一串,t是临时保存字母
int target,len,a[];//a数组来保存字母对应的数字
bool flag,vis[];//flag标记是否找到
bool isobj(int v,int w,int x,int y,int z,int tar){
if(v - w*w + x*x*x - y*y*y*y + z*z*z*z*z == tar) return true;
else return false;
}
void dfs(int k)
{
if(k==){//边界条件
if(isobj(a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],target) && !flag){
flag=true;cout<<t<<endl;//找到第一个字符串直接输出即可,此时就是最大字典序
}
return;//直接返回
}
for(int i=len-;i>=;--i){//从后往前遍历字符串
if(!vis[s[i]-'A']){//如果当前字母没有访问
t[k]=s[i];//先存到t数组中
vis[s[i]-'A']=true;//并标记为暂时的访问过
dfs(k+);//从每个当前位置进行深搜
vis[s[i]-'A']=false;//不满足条件的把原来标记的记为未访问过(回溯)
}
}
}
int main()
{
for(int i=;i<;i++)a[i]=i+;//对26个字母进行编号赋值
while(cin>>target>>s && (target||strcmp(s,"END"))){
memset(vis,false,sizeof(vis));//初始化为假值,表示都未访问过
memset(t,'\0',sizeof(t));
len=strlen(s);//目标字符串的长度
flag=false;sort(s,s+len);//排序
dfs();//从第0个目标字符开始深搜
if(!flag)cout<<"no solution"<<endl;//找不到
}
return ;
}
题解报告:hdu 1015 Safecracker的更多相关文章
- HDOJ(HDU).1015 Safecracker (DFS)
HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1 ...
- hdu 1015 Safecracker 水题一枚
题目链接:HDU - 1015 === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein s ...
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
Safecracker Time Limit: 2 Seconds Memory Limit: 65536 KB === Op tech briefing, 2002/11/02 06:42 ...
- HDU 1015 Safecracker【数值型DFS】
Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)
Safecracker Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total S ...
- HDU 1015.Safecracker【暴力枚举】【8月17】
Safecracker Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is lo ...
- HDU 1015 Safecracker
解题思路:这题相当诡异,样例没过,交了,A了,呵呵,因为理论上是可以通过的,所以 我交了一发,然后就神奇的过了.首先要看懂题目. #include<cstdio> #include< ...
- HDOJ/HDU 1015 Safecracker(深搜)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
- HDOJ/HDU 1015 Safecracker(枚举、暴力)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
随机推荐
- 家的范围 Home on the Range(洛谷 2733)
题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...
- android开发里跳过的坑——图片文件上传失败
使用的apache的httpclient的jar包,做的http图片上传,上传时,服务器总返文件格式不对.后来发现,是由于在创建FileBody时,使用了默认的ContentType引起的.所以服务器 ...
- HDU——3072 Intelligence System
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Spring基础入门(三)
一.Spring的jdbcTemplate操作 (1)Spring是一站式框架,对于javaee三层,每一层都有解决技术. web层:springMVC service:spring的ioc dao层 ...
- Servlet自动刷新页面
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/auto-refresh.html: 假设一个Web页面,显示了现场比赛得分或股票市场状况或货币兑 ...
- 使用Hexo搭建博客
好长时间没在博客园写东西了,自己搭了一套博客,把自己的一些积累分享给大家,欢迎指正! 博客地址:http://www.baiguangnan.com 使用Hexo搭建自己的博客,可以参考这里:http ...
- vux picker
1.通过实验证明: PopupPicker = TransferDom + Popup + PopupHeader + Picker 2.代码 Picker.vue <!-- Picker 组件 ...
- 工作总结 EF GroupBy() Select() Select() 中 Count() 分组 求总
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Linux系统编程_6_进程环境(C程序典型的存储空间)
1.八种结束Linux进程的方法: 五种正常终止方式: main函数返回: 调用exit: 调用_exit或_Exit 最后一个线程从其启动例程返回 最后一个线程调用pthread_exit 三种异常 ...
- easyUI的getChanges中的inserted
easyUI中的datagrid.treegrid编辑了数据,可以用getChanges命令来获取更新情况.按道理,有"inserted"."updated". ...