字梯問題 bfs python

2021-09-23 16:58:11 字數 2452 閱讀 9654

給定兩個單詞(start, end)和乙個字典,要求找出從單詞start變化到end的最小序列。變化過程**現的中間單詞必須是字典中有的單詞,且每次只能是變化其中的乙個字母。

比如start= 「hit」, end= 「cog」, dict = [「hot」, 「dot」, 「dog」, 「lot」, 「log」]。 那麼從start變化到end經過了5步,即"hit"→"hot" →"dot" →"dog"→"cog"。

# _*_ coding=utf-8 _*_

__author__ =

'srf'

__date__ =

'2019/5/26 8:05'

# 字梯問題

'''將單詞和與其相差乙個字元的單詞之間構造邊 構造無向圖

利用寬搜計算兩點間最短路徑

'''from collections import defaultdict

class

bfsresult

:def

__init__

(self)

: self.level =

self.parent =

# 最短路徑

deffind_shortest_path

(r, v)

: path =

[v,]

# 獲得源點

source_vertex =

[vertex for vertex, level in r.level.items(

)if level ==0]

[0]if v != source_vertex:

while r.parent[v]

!= source_vertex and r.parent[v]

isnot

none

: v = r.parent[v]

path.reverse(

)return path

class

graph()

:def

__init__

(self)

: self.adj = defaultdict(

list

)def

add_edge

(self, u, v)

:for w in v:

if w in self.adj[u]

orlen

(w)!=

len(u)

:continue

match =

[i for i in

range

(len

(u))

if w[i]

== u[i]

]# 儲存相同字元的索引

iflen

(match)

==len

(u)-1:

# 若相同字元為字串長度減一 符合變化要求 構造邊

self.adj[u]

self.adj[w]

defbfs

(g, s)

:# 圖 初始節點

r = bfsresult(

) r.level =

r.parent =

i =1# 記錄層編號 012

frontier =

[s]while frontier:

next=[

]for u in frontier:

for v in g.adj[u]

:if v not

in r.level:

r.level[v]

= i r.parent[v]

= u next

frontier =

next

i +=

1return r

if __name__ ==

'__main__'

: g = graph(

)dict=[

"hot"

,"dot"

,"dog"

,"lot"

,"log"

] start =

"hit"

end =

"cog"

dict

.extend(

[start, end]

)# 將起始點加入dict 否則構造的圖不完整

for i in

dict

: g.add_edge(i,

dict

) r = bfs(g, start)

print

(start +

"到"+ end +

"的最短路徑為"

)print

(find_shortest_path(r, end)

)

字梯遊戲求解

在字梯遊戲中,每乙個詞都是通過將字梯中的前乙個詞改變乙個字母形成的。例如,我們可以通過一系列的單字母替換將zero轉換成five zero,hero,here,hire,fire,five。這是乙個無權最短路徑問題,其中每個詞是乙個頂點,如果兩個頂點可以通過乙個字母的替換相互轉化的話,在這兩個頂點之...

linux套接字bind error問題

下午練的linux套接字出了一些毛病,各種錯誤,先貼出正確 struct sockaddr in linuxaddr linuxaddr.sin addr.s addr htonl inaddr any linuxaddr.sin family af inet linuxaddr.sin port ...

字的邊界對齊問題

arm微處理器中支援位元組 半字 字三種資料型別,其中,字需要4位元組對齊 位址的低兩位為0 半字需要2位元組對齊 位址的最低位為0 1 字對齊資料,也就是說每個資料都是用字 32位 來表示的,而arm中的儲存單元都是以位元組為單位,那麼要索引乙個資料,需要連續的4個位元組才行,比如,0x0000 ...