把数字串变成2012玛雅密码
来源:互联网 发布:电信云计算公司怎么样 编辑:程序博客网 时间:2024/05/29 16:59
问题:
玛雅密码是一串由0、1、2组成的密码,这串数字中如果包含2012,就可以解开末日的大门。给定一串由0、1、2组成的字符串,只有相邻的数字可以交换,求通过最少多少次变换可以得到玛雅密码,并给出这串密码。
思路:
经过很久很久的尝试,放弃了一次性拼凑2012的想法,改用预处理得到所有数字范围中符合玛雅密码的部分,再递归遍历给定的数字串,得到该串所有可能的变换,并比较每个变换的结果需要的步数。
import sys def find_all_transfers(str): result={} if len(str) == 0: result[str] = 0 for index in range(0, len(str)): first=str[index] next_str=str[0:index] + str[index+1:len(str)] next_result=find_all_transfers(next_str) #print("next_result is: ") #print(next_result) for key in next_result: steps = index+next_result[key] if first+key not in result or steps < result[first+key]: result[first+key] = steps return result def build_map(): map={} for i in range(0, 3**13-1): if check_2012(i): map[i] = True return map def check_2012(number): while number >= 59: if number%81 == 59: return True number /= 3 return False def from_3_to_10(str): count=0 iterator = range(0, len(str)) for i in iterator: count+=int(str[-i-1])*(3**i) return count map = build_map() #print(map) str=raw_input("input string from 0,1,2: ") print("str is %s"%str) result = find_all_transfers(str) #print(result) min = sys.maxint min_key = "" for key in result: number = from_3_to_10(key) #print("value of %s is %d"%(key, number)) if check_2012(number): #print("min is %d"%min) #print("result[key] is %d"%result[key]) if min > result[key]: min = result[key] min_key = key print("min steps is %d, final string is %s"%(int(min), min_key))
0 0
- 把数字串变成2012玛雅密码
- 用序列化把Object变成字串。
- 玛雅 玛雅文明 2012
- C#里把XML对象变成一个字串
- 把某个数变成8的倍数
- Java 把数字串转换为对应汉字输出
- 技巧:把输入的密码变成*号的方法
- 字串数
- 字串数
- java中把一个百分制数变成小数
- 把字串转成ASCII
- 玛雅预言2012的误区
- java中如何输入数字串,过滤掉逗号,把他们放入数组
- hdu 1261 字串数
- 数字串划分
- 【贪心】数字串
- [瞎搞队列]数字串
- PHP 格式化数字串
- Hadoop mapper类和reducer类的阅读 Hadoop(1)
- codeforces Round #261(div2) D解题报告
- TOAD 11 注册码
- 直线点画模式
- HBase Java API详解
- 把数字串变成2012玛雅密码
- 写请求的数据
- 爬楼梯
- C语言清空输入缓冲区的N种方法对比
- Redis源码分析(十一)——Redis数据库db
- 一个资深HR的面试建议--不仅仅适用于应届生!
- 机器学习之&&Andrew Ng课程复习--- 学习笔记(第三课)
- mvc提示
- 纪念第一次写博客