基本算法3

周游:
from enum import Enum
class COLORS(Enum):
    white=1
    gray=2
    black=3
class NODE(object):
    def __init__(self,value):
        self._value=value
        self.connections={}
        self._parent=None
        self._color=COLORS.white

    def __str__(self):
        return str(self._value)

    def getWeight(self,item):
        return self.connections.get(item,0)
    def addNeibor(self,item,weight=1):
        self.connections[item]=weight

    @property
    def color(self):
         return self._color
    @color.setter
    def color(self,value):
        self._color=value

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self,value):
        self._value=value
    @property
    def parent(self):
        return self._parent
    @parent.setter
    def parent(self,item):
        self._parent=item


    def getNeibor(self):
        return self.connections.keys()

    def getNeiborByOrder(self):
        ret=[]
        for neibor in self.getNeibor():
            if neibor.color==COLORS.white:
                sons=[son for son in neibor.getNeibor() if son.color==COLORS.white]
                ret.append((len(sons),neibor))
        ret.sort(key=lambda x:x[0])
        return [son[-1] for son in ret]


    def setParent(self,item):
        self.parent=item

    @property
    def dis(self):
        return self._dis

    @dis.setter
    def dis(self,value):
        self._dis=value



class GRAPH(object):
    def __init__(self):
        self.sons={}
        self.size=0

    def show(self):
        for item in self.getall():
            return  (item)

    def addSon(self,value):
        self.sons[value]=NODE(value)
        self.size +=1

    def getSon(self,value):
        return self.sons.get(value,None)
    def getall(self):
        return  self.sons.values()

    def addEdge(self,value1,value2,weight=1):
        if value1 not in self.sons:
            self.addSon(value1)
        if value2 not in self.sons:
            self.addSon(value2)
        self.sons[value1].addNeibor(self.sons[value2],weight)

def creatSons(m,n,row,col):
    steps=[(-2,-1),(-2,1),(-1,-2),(-1,2),
          (2,-1),(2,1),(1,-2),(1,2)]
    legal_pos=[]
    for step in steps:
        x=row+step[0]
        y=col+step[1]
        if x>0 and x<m+1:
            if y>0 and y<n+1:
                legal_pos.append((x,y))
    return legal_pos

def genId(m,n,row,col):
    return (row-1)*m+col

def genData(m,n):
    g=GRAPH()
    for i in range(1,m+1):
        for j in range(1,n+1):
            neibors=creatSons(m,n,i,j)
            for neibor in neibors:
                g.addEdge(genId(m,n,i,j),genId(m,n,neibor[0],neibor[1]))
    return g

def lvYou(total_steps,current,num,path):
    if num != total_steps:
        current.color=COLORS.gray
        flag=False
        for son in current.getNeiborByOrder():
            if son.color == COLORS.white :
                flag=lvYou(total_steps,son,num+1,path)
            if  flag:
                path.append(current)
                break
        if not flag:
            current.color=COLORS.white
        else:
            return True
    else:
        print('sucess',num,total_steps)
        current.color=COLORS.gray
        path.append(current)
        return True

def main():
    m=8
    n=8
    start=genId(m,n,1,1)
    g=genData(m,n)

    item=g.getSon(start)
    path=[]
    lvYou(m*n,item,1,path)
    print('====>>>>>',len(path))
    tt=[]
    for item in path:
        print(item)
    
main()
原文地址:https://www.cnblogs.com/testzcy/p/12366216.html