給定兩個單詞(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 ...