編號為1~8的8個正方形滑塊被擺成 3 行3列(有乙個空格留空),每次可以把與空格相鄰的滑塊(有公共邊才算相鄰)移到空格中,而它原來的位置就成為了新的空格。給定初始局面和目標局面(用0 表示空格),需要你幫忙計算出最少的移動步數。如果無法達到目標局面,就輸出「 -1 」。26
4137
58 8
1573
642
樣例輸入:
2 6 4 1 3 7 0 5 8
8 1 5 7 3 6 4 0 2
樣例輸出: 31
**:
#include#include#includetypedef int state[9];//定義「狀態」型別
const int max = 1000000;
state st[max], goal;//狀態陣列,儲存所有狀態.
int dist[max];//距離陣列.
const int dx = ;
const int dy = ;
const int maxn = 1000003;
int head[maxn],next[maxn];
int vis[3628800],fact[9];
void init_lookup_table()
int try_to_insert(int s)//通過」code「把排列變成整數
if(vis[code])
return 0;
return vis[code] = 1;
}//bfs,返回目標狀態在st陣列的下標。
int bfs()
}front++;//擴充套件完畢後再修改隊首指標。
} return 0;
}int main()
思路解析:
八數碼問題歸根到底就是圖上的最短路問題,其中每個狀態就是9個格仔中的滑塊編碼(從上到下,從左到右地把它們放在乙個包含9個元素的陣列中)。
**中的memcmp()函式和memcpy()函式,用來進行整塊記憶體的比較和複製,比用迴圈比較和迴圈賦值效率要高。
**中的init_lookup_table()和try_to_insert(rear),作用是進行bfs中 的判斷是否重複。把"0~8"的全排列和0~362879的整數一一對應起來,只開乙個一維的陣列即可。
也可以使用雜湊函式,把結點「變成」整數,但不必是一一對應,就是構造雜湊函式h(x),然後把任意結點x對映到某個給定的範圍[ 0,m-1]的整數即可。注意不同結點的雜湊值也有相同的,此時需要開乙個大小為m的陣列。把雜湊值相同的狀態組織成煉表。。。
**:
const int maxn = 1000003;
int head[maxn],next[maxn];
void init_lookup_table()
int hash(state & s)
int try_to_insert(int s)
next[s] = head[h];//插入到鍊錶中。
head[h] = s;
return 1;
}
八面碼問題 BFS Hash
include include include include include include include include includeusing namespace std typedef int state 9 const int maxn 1000000 state st maxn go...
八卦與ASCII碼
嘗試用伏羲八卦與計算機ascii 建立聯絡 坤0 震1 坎2 兌3 艮4 離5 巽6 幹7,採用二的n次方表示。美國資訊交換標準碼 ascii american standard code for information interchange 起始於50年代後期,最後完成於1967年。ascii字...
Eight八位數問題2
通過程式的多次執行計算,發現此題可能有多個解!例如 2 3 4 1 5 x 7 6 8 發現有以下三個解都符合要求 ullddrurdllurrdlurd dlurullddrurdllurdr ullddrurdllurdruldr 所以大家在做的時候要注意,不一定是你的 有問題,而是問題描述時沒...