栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

用Python算codefight上第33题 汉密尔顿路径问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用Python算codefight上第33题 汉密尔顿路径问题

codefight上第33题,给一个字符串列表,如果两个字符串相差1个字母,判定可以连接。要求判定整个列表是否可以连接起来,直接使用暴力算法,用迭代器permuations方法,列出所有可能的排列,然后判定能否从头串到尾。

写完了才想起来是个汉密尔顿路径问题,应该有些更好的方法。由于是个NP完全问题,所以速度提高空间非常有限。

# This is a hamilertion path problem.
# First create a matrix to save possible path for each point by funtion "issm" 

import copy
def solution(a):
    matrix=[]
    b=copy.copy(a)
    print("len(a)",len(a))
    if len(a)==2:
        if issm(a[0],a[1])==1:
            return True
        else:
            return False
    elif len(a)==1:
        return True
        
           
    for i in range(len(a)):#构建矩阵
        n=[]
        for j in range(len(a)):
            n.append(issm(a[i],a[j]))
        print("n:",n)
        matrix.append(n)
    print("matrix,",matrix)
    
    # 逐一计算每行,判定是否存在接口,同时有完全相同元素的元素,返回False。此类情况,说明2个相同元素链接到同一个第三元素上,拓扑上是分支结构。
    m=[]#接口数
    n=[]#完全一样的字符串数
    for i in range(len(matrix)):
        if matrix[i].count(1)==0 or (matrix[i].count(1)==1 and matrix[i].count(0)>1 and len(a)>3):
            return False
        m.append(matrix[i].count(1))
        n.append(matrix[i].count(0))
    print("m:",m)
    print("n:",n)
    print("old a",a)   
    
    if m.count(1)>2:
        return False
    else:
        for i in range(len(a)):
            if matrix[i].count(1)==1:
                a.remove(b[i])
        if len(a)==len(b):
            a.pop()
        
        print("new a",a)
        return(solution(a))
   
       


def issm(b,c):  #计算相似性,返回2个字段差异
    n=0
    for i in range(len(b)):
        if b[i]!=c[i]:
            n=n+1
        else:
            n=n+0
    if n==1:
        return(1)
    else:
        return(0)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/887054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号