把数字串变成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))  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值