转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5573934.html

这个题目的题意:(自己结合百度翻译,简单的翻译了一下)

“这个项目是在一个在二楼图书馆一幅画的背后的克莱因的保险箱里。克莱因的保险柜是极为罕见的;他们中的大多数都随着克莱因和他的工厂在二战中被摧毁。幸运的是,老布伦博在他死之前研究发现了克莱因的秘密并写下来了。一个克莱因保险箱有两个特点是:一个使用字母而不是数字的组合锁,和一个刻在门上的引用。克莱因的引用总是包含五个和十二个不同的大写字母之间,通常在句首,并提到了一个或多个数字。五种大写字母的形成了打开保险柜的密码。通过把所有的数字与适当的方式相结合,你将得到一个数字目标。(构造目标密码的细节)要找到组合,你必须选择五个字母,v, w, x, y, 和 z 并满足下面的方程,其中每一个字母被替换的顺序位置在字母组中(a= 1,b= 2,…,z= 26)。组合是vwxyz。如果有一个以上的解决方案则选择字典最大的组合,即,组合会出现在字典上的最后一个。”

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

例如,给定的目标1和字母abcdefghijkl,一个可能的解决方案是fiecb,6 - 9 ^ 2 + 5 ^ 3 - 3 ^ 4 + 2 ^ 5 = 1。其实在这种情况下的几种解决方案,但最终组合是lkeba。克莱因认为雕刻的编码组合是安全的,因为它可能需要几个月的努力,尝试所有的可能性,即使你知道这个秘密。当然,电脑那时不存在了。”

“开发一个程序,以寻找克莱因组合,以准备现场部署。按部门规定使用标准测试方法。输入包含一个或多个包含一个正整数目标低于一千二百万,并且至少五个最多十二个不同的大写字母。最后一行将包含一个零和字母的组合码 END 意味着输入结束。每行输出的克莱因组合是乱序的,如果没有正确的组合输出'no solution'。使用下面显示的精确格式。”

简单的题意是:

  从输入的字符串中,找出五个字母代替v、w、x、y、z,符合v - w^2 + x^3 - y^4 + z^5 = target 的所有答案中,输出最大的字符串。

我是思路是:获取长度为5的组合数,进行全排列并判断是否符合目标函数。

  因为做这道题,我把全组合和全排列算法实现了一遍。http://www.cnblogs.com/xiezie/p/5574516.html

注意:我偷了个懒,这道题我下面的代码可以优化,不过思路一样。

  可以不将结果存储起来,只需要实现字典序全排列,输出最后一个结果即可(将结果保存起来用字符串保存起来,一旦遇到下一个合适的字符串则替换)

以下是java实现:

import java.util.*;

import java.io.*;

public class Main1015{

    public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
int target;
String inputStr;
ArrayList<String> answers = new ArrayList<>();
ArrayList<String> combinations = new ArrayList<>();
ArrayList<Character> com = new ArrayList<>(5);
while(true){
target = scan.nextInt();
inputStr = scan.next();
if(target ==0 && inputStr.contentEquals("END")){
break;
}
answers.clear();
combinations.clear();
com.clear();
//获取所有的组合
getCombinations(combinations,inputStr.toCharArray(),0,5,com);
//获取全排列
for(int i = 0 ; i != combinations.size() ; i ++ ){
ArrayList<String> permutations = new ArrayList<>();
getAllPermutations(permutations,combinations.get(i).toCharArray(),0,combinations.get(i).length());
//判断是否符合target函数,符合则放入answer
for(int j = 0 ; j != permutations.size() ; j ++){
if(target(permutations.get(j), target)){
answers.add(permutations.get(j));
}
}
} String answerCode = "" ;
for(int i = 0 ; i != answers.size() ; i ++ ){
if(answers.get(i).compareTo(answerCode)>=1){
answerCode = answers.get(i);
}
}
if(answerCode.equals("")){
System.out.println("no solution");
}else{
System.out.println(answerCode);
}
}
scan.close();
} static boolean target(String s,int target){
char[] cs = s.toCharArray();
return (cs[0]-'A'+1)-Math.pow(cs[1]-'A'+1,2)+Math.pow(cs[2]-'A'+1,3)-Math.pow(cs[3]-'A'+1,4)+Math.pow(cs[4]-'A'+1,5)==target;
} static void getAllPermutations(ArrayList<String> answers,char[] cs,int start,int len){
if(start == len ){
answers.add(String.valueOf(cs));
return;
}
for(int i = start ; i != len ; i ++){
swap(cs,i,start);
getAllPermutations(answers,cs,start+1,len);
swap(cs,i,start);
}
} static void getCombinations(ArrayList<String> list ,char[] cs, int start,int len,ArrayList<Character> com){//len为组合的长度
if(len == 0){
String s = "";
for(int i = 0 ; i != com.size() ; i ++){
s = s.concat(com.get(i).toString());
}
list.add(s);
return;
}
if(start==cs.length){
return;
}
com.add(cs[start]);
getCombinations(list,cs,start+1,len-1,com);
com.remove(com.size()-1);
getCombinations(list,cs,start+1,len,com);
} static void swap(char[] cs , int i , int j){
char t;
t = cs[i];
cs[i] = cs[j];
cs[j] = t;
}
}

HDOJ-ACM1015(JAVA) 运用 组合、全排列实现的更多相关文章

  1. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  2. Java中组合 设计技巧 实例

    关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044    Java的组合(持有对 ...

  3. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  4. java 全组合 与全排列

    一.全组合 public static void Combination( ) { /*基本思路:求全组合,则假设原有元素n个,则最终组合结果是2^n个.原因是: * 用位操作方法:假设元素原本有:a ...

  5. JAVA 设计模式 组合模式

    用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构

  6. Java之组合数组1

    我们先说"数组",数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. 一.一维数组的定义 type arrayName[]; 其中类型(type ...

  7. java实现组合问题

    刚才刚更新了排列问题,顺带把组合问题也发表一下 1.问题描述: 已知有m个球,从m个球中取n个球有多少种不同的取法. 2.输入示例: 请输入总球的个数和要取的球的个数 6 5 3.输出示例: 共有6种 ...

  8. JAVA递归实现全排列

    全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例 ...

  9. JAVA实现组合、排列、重复排列(多层循环)

    1.代码 package com.hdwang; import java.util.ArrayList; import java.util.Arrays; import java.util.List; ...

随机推荐

  1. Python 多进程

    import threading from time import sleep from msalt_proxy.client import Client def f(t): print t cli= ...

  2. Ubuntu启动停止在checking battery state...

    Ubuntu在“checking battery state...”处停止了,出现这种现象的原因可能有很多种.笔者遇到的是其中的一种. 情景描述: 笔者此前将Ubuntu的图形启动方式修改为了字符界面 ...

  3. App新版本提醒

    童鞋们是否遇过在使用app的时候出现有新版本更新跳转到苹果商店的提示呢? github中有一个三方框架 Harpy 完美实现了这一功能! demo时刻 我的github - Harpy

  4. Linux的直接I/O机制

    转自Linux的直接I/O机制 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O.本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程 ...

  5. 10个基于 Ruby on Rails 构建的顶级站点

    本文系国内 ITOM 行业领军企业 OneAPM 工程师翻译整理自 Raviraj Hegde 的文章 Top Sites Built with Ruby on Rails. 就其本身而言,Ruby ...

  6. Python 标准库 urllib2 的使用细节

    刚好用到,这篇文章写得不错,转过来收藏.    转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...

  7. activiti集成spring异常(DbSqlSession)

    在eclipse配置一个简单的activiti项目,配置的是mysql数据库,报错如下: SLF4J: Failed to load class "org.slf4j.impl.Static ...

  8. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-009-用SPEL给bean运行时注入依赖值

    1.When injecting properties and constructor arguments on beans that are created via component-scanni ...

  9. Google的代码风格规范,各种语言都很全

    https://code.google.com/p/google-styleguide/

  10. 166. Fraction to Recurring Decimal

    题目: Given two integers representing the numerator and denominator of a fraction, return the fraction ...