15迷問題的證明 15 puzzle

2021-04-12 14:45:01 字數 1784 閱讀 4542

134

152512

76111489

1013

(a)12

3456

78910

1112

1314

15 (b)

(c)首先我們來回顧一下《計算機演算法基礎》這本書上對15-迷問題敘述:在乙個分成16格的方形棋盤上放有15個遍了號的牌(如上圖)。對這些牌給定一種初始排列圖(a),要求通過一系列合法的移動將這初始排列轉換成圖(b)所示的那樣的目標排列(只有領接於空格的牌移動到空格才是合法的移動)。

易於看出棋盤上這些牌有16!種不同的排列。對於任意給定的初始狀態能否達到圖(b)所示的目標狀態?實際上任意初始狀態只能達到它所有狀態的一半,也就是說不是任意的初始狀態都可能達到目標狀態!我們先給棋盤的方格編上1-16的號碼。位置 i 是在圖(b)所示的目標排列中放 i 號牌的方格位置,位置16是空格的位置。假設 position( i )是編號為 i 的那塊牌在初始狀態下的編號,1<=i<16;position( 16 )表示空格的位置。對於任意一種狀態,設 less(i) 是使牌 j 小於牌 i 且 position( j ) > position( i )的數目(j 為任意滿足條件的數,1<= j < i)。例如,對於圖 7.2(a) 所示的狀態,有 less(1) = 0,less(4) = 1 和 less(12) = 6。在初始條件下,如果空格在圖(c)的陰影位置中的某一格處,則令 x = 1;否則令 x = 0。於是有如下定理。

定理:當且僅當是偶數,圖(b)所示的目標狀態可能由此初始狀態到達。

用通俗一定的話來說,less( i ) 就是數字比 i 小,但是位置在 i 後的牌的總和。如果初態可解,那麼 1 至 16 的 less( i )的加和加上 x 必為偶數。下面我用遞迴的方法來證明這個問題。證明的過程不是由初始態向目標態推演,而是由目標態向初始態轉變。因為如果給定初始態可轉變成目標狀態,那麼目標狀態在有限的步長下也可以轉變成初始狀態。所以對定義的證明可以轉化為證明從目標態出發,任意步移動後的狀態都滿足定理所述的條件。

如果從目標態出發經過 k 步可以轉變成初始狀態,那麼如果第1 步和第 k-1 成立,那麼第 k 步就一定成立。

證明:

設 p = less(i) 的加和 + x(定理公式); 則目標態 p = 0;

第 1 步可以選擇 15 移動到空位,也可以選擇 12 移動到空位。如果選擇 15 移動,那麼less(15)=0, less(16)  = 1, x = 1;  p = 2 公式成立;如果選擇 12 移動到空位,那麼 less(12) = 3,less(16) = 4; x = 1; p  = 8 公式仍然成立。(空格的牌號為16,為最大值)

假設第 k-1 步成立,那麼對於第 k 步也必定要成立。此時空格可以位於任意位置,假設處於 i,它可以選擇上、下、左、右任意的位置移動(如果範圍允許)。在左移的情況下,假設左邊數字為 j ,less( 16) = less(16)+1;less( j )不變,x = x +1 or x = x -1,其它任意值的less值也不會變化;所以 p = p 或者 p = p+2;因此空格左移成立,右移證明與左移相似。在上移的情況下,假設上一格的數字為 j,位於空格和 j 之間的牌共有三張。當空格移上之後 less(16) = less(16)+4;p = p + (+/-)1+(+/-)1+(+/-)1;x = x +1 or x = x -1;可以看出這三個數相加仍為偶數。取p = p + (+/-)1+(+/-)1+(+/-)1的原因是 j 後移三格後與這三個數字肯定分別存在大小關係,因此就必定有+1或-1的操作。下移與上移類似。

證畢。該證明可以進一步拓廣為 n-迷 (n puzzle) 問題。

創業我們必須面對的15個問題

創業的靈感就是從那時的工作中被激發。每天頻繁的使用 參加 會議,一打就是一兩個小時,手 臂痠軟,心情也變得不耐煩,自己抱怨的時候就想為何不戴著耳機參加 會議呢。那個被壓抑了很多 的創業念頭在召喚我,努力不一定成功,放棄我會終身遺憾!然而,半年的創業一下子使我們這個團隊都垮了 教訓有 只關注it內動向...

LeetCode 15 腐爛的橘子 BFS問題

題目描述 難度 簡單 在給定的網格中,每個單元格可以有以下三個值之一 值 0 代表空單元格 值 1 代表新鮮橘子 值 2 代表腐爛的橘子。每分鐘,任何與腐爛的橘子 在 4 個正方向上 相鄰的新鮮橘子都會腐爛。返回直到單元格中沒有新鮮橘子為止所必須經過的最小分鐘數。如果不可能,返回 1。示例 1 輸入...

解題筆記(15) 幾個棧和遞迴的問題

本文介紹了幾個棧和遞迴的問題,當然遞迴的本質就是棧。這些問題網上都能找到解答,自己思考並實現了一下,供參考。問題1 跳台階問題。具體描述,乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間 雜度。思路 簡單分析一下,這道題不難。假設f n 為問題的解,從後往...