八數碼為什麼可以歸結為圖的最短路問題?

時間 2021-05-29 22:38:25

1樓:CuKing

每種盤面對應乙個節點,只不過平常給節點編號用自然數,這裡乙個盤面就是乙個編號。

給乙個盤面進行挪動的不同方法,就對應了若干出邊,指向挪動後的盤面。

然後把盤面a變成盤面b,就相當於在圖上找一條路徑從a走到b。路徑上的邊就相當於對盤面的挪動方法。

找最少步數的話,就是在圖上跑最短路了。

2樓:制糕神的演算法工坊

用最"暴力"的方法去理解這個問題:

比如現在是這樣:

0的位置是對應空出來的位置

考慮把"9"向右挪動一步的狀態("狀態"就是棋盤的樣子):

(別問我為什麼沒有6,因為數錯數了)

不妨把這兩個狀態用乙個9位整數來表示。

第乙個狀態對應的整數是124357890,第二個狀態對應的整數是124357809.

這兩個整數太長了,不如把它用 來替換.

建立 到 的一條長度為1的邊,就對應著"第乙個狀態"通過挪動某個數字能夠到達"第二個狀態"。由於在八數碼的問題中,"通過挪動某個數字"這個操作是雙向的,所以 到 也有長度為1的邊,也就是無向圖。

假設當前狀態為 ,目標狀態為 ,對應整數分別是 .

那麼通過建立所有整數的邊之後,就組成了乙個無向圖。

到 的最短路長度,就等價於其最少運算元。

而任意兩個點 之間的一條路徑,就對應著一種"操作順序"。

我猜題主在看廣度優先搜尋方面的知識,在此也一併說了吧。由於這個圖並不能顯式地建出來,但是我們知道當前節點能到達哪些節點,那麼只需要記錄「當前節點距離起始點的距離」,以及"這個點是否被訪問過"即可。因為有了當前節點的距離,就能直接計算出"相鄰沒有被訪問過的節點距離原點的距離"。

需要用到佇列相關的知識。

問題來了,用9位整數儲存是不是過於浪費了?畢竟合法的狀態並沒有很多個

這時候就可以採用雜湊表的做法,直接用雜湊表分配新建出點的標號即可。

也就是把《整數值|這個整數值對應的序號》看作的鍵值對,採用雜湊表的做法。

雜湊表的知識可以見我的文章~

制糕神的演算法工坊:OI/ACM中的雜湊表,一些雜湊演算法以及題目

為什麼不把後悔歸結為慾望,還有,為什麼會忽略時間不會因為珍惜而減慢 生命本身沒有意義的事實?

霧隱太行 無欲則剛。後悔的起源當然是慾望,但後悔的根本是內心不夠強大。勸君 但行好事莫問前程。你就不會後悔。時間不會因為珍惜而減慢,反而會加快。你越珍惜一樣東西,你便會失去的越快。生命本身是什麼?是肉體本身還是變數的時間?如果指肉體本身,那這副臭皮囊不過是容器是爐鼎是過程 如果指變數的時間,那時間本...

為什麼有些人會把任何問題都歸結為體制問題?

周明凱 體制是否有問題尚且不說,我先退一步假設我們的體制有問題,即使是這樣社會的政治和法律體制對人的控制要分兩方面看。它既是暴力強加在人們頭上的,又是這個社會大多數人的選擇。在人類歷史的早期,經常發生部族或國家間的戰爭,戰敗被俘者通常經過乙個莊嚴而又正規的儀式,被剝奪作為人的資格,從人淪落為奴隸。在...

為什麼大家越來越不願意將自己的成功歸結為努力了?

小迅的雜貨鋪 現在大家對成功的定義多元化了,所以努力的方式也不能一概而論了。以前所說的努力,大部分是體力上的付出,現在的努力,有時候是體力上的付出,也有時候是腦力上的付出。有些人獲得成功的方式,或許不是大家平時可以看到的體力上的努力,但不能說他獲得成績,就沒有付出。比如以前的學生想得到好成績,就使用...