把数字串变成2012玛雅密码

问题:

玛雅密码是一串由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))  
时间: 2024-10-24 10:24:12

把数字串变成2012玛雅密码的相关文章

[华为]在字符串中找出连续最长的数字串

链接:https://www.nowcoder.com/questionTerminal/2c81f88ecd5a4cc395b5308a99afbbec来源:牛客网 样例输出 输出123058789,函数返回值9 输出54761,函数返回值5 接口说明 函数原型: unsignedint Continumax(char** pOutputstr,  char* intputstr) 输入参数:   char* intputstr  输入字符串: 输出参数:   char** pOutputst

在字符串中找出连续最长的数字串

输入描述: 输入一个字符串. 输出描述: 输出字符串中最长的数字字符串和它的长度. 输入例子: abcd12345ed125ss123058789,如果有重复的最大长度的数字串,则一起输出,如1456jk4789,输出14564789,4 输出例子: 123058789,9 思路:先把字符串中的数字串取出来,然后取出长度最大的数字字串并输出,刚开始我使用HashMap的key存储数字字串,value存字串长度,考虑到HashMap存储无序,故改为LInkedHashMap,然后根据Map的val

笔试算法题(37):二叉树的层序遍历 &amp; 最长递增的数字串

出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分析: 原始的层序遍历类似于BFS,打印当前访问的节点curNode的序列号,并将其直接子节点放入队列queue中,然后从queue中取出下一个节点,直 到队列为空:此方法仅能按照层序打印所有节点,并不能区分每一层节点的数量:如果需要区分当前层次的节点,和当前层次节点的子节点,可以使用两个队列 que

比较字符串和数字串(轉載)

比较字符串 和数字串 要比较字符 串(类型 C)和数字 文本(类型 N),可以 在逻辑表达 式中使用下 列运算符. <运算符>含 义 CO 仅包 含 CN 不仅 包含 CA 包 含任何 NA 不 包含任何 CS 包 含字符串 NS 不 包含字符串 CP 包含模 式 NP 不包 含模式 因为除类型 N和 C 外,系统不 能执行任何 其它类型转 换,所以, 在进行包含 这些运 算之 一的比较时 ,操作数应 该是类型 N 或 C. 运算符的功 能如下: CO (仅包含) 如果 <F1> 

在字符串中找出连续最长的数字串 在字符串中找出连续最长的数字串,并把这个串的长度返回

写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存.例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9, #include<iostream> using namespace std; int ContinueMax(char *

解决 PHPExcel 长数字串显示为科学计数

解决 PHPExcel 长数字串显示为科学计数 https://github.com/PHPOffice/PHPExcel/ 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. 使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种: 1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetInd

parseInt在IE8转换返回不相等(parseInt(&quot;08&quot;)返回0等以0开头大于7的数字串)

描述 在IE8内核下parseInt("08")返回0,等以0开头大于7的数字串返回的值不相等 解决方法 parseInt当不指定radix时,当以0x开头时,s按照十六进制计算的:如果以0开头且第二位不为x,则s是按照八进制计算的,因为八进制不能有8,9所以报错返回0. 测试有效效果 parseInt("08",10)==8

微软算法100题25 查找连续最长的数字串

第25 题:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存.例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指的值为123456789 思路:两个指针,一个保存当前最长长度的变量max,然后移动指针,直到到字符

数字串

[题目描述] 给定一个长度为n的数字串,数字串里会包含1~m这些数字.如果连续的一段数字子串包含了1~m这些数字,则称这个数字字串为NUM串.你的任务是求出长度最短的NUM串是什么,只需要输出这个长度即可.1 <= n,m <= 200000. [输入描述] 第一行给定n和m: 第二行给定n个数,表示数字串,数字间用空格隔开. [输出描述] 如果存在NUM串则输出最短NUM串长度,否则输出“NO”. [样例输入] 5 3 1 2 2 3 1 [样例输出] 3