Eight HDU - 1043 bfs+康託展開
這題是一道裸的八數碼問題,用 0 表示空格
,相當於一共有9個數字,012345678,9個數字共9!
種排列。
剛開始我使用map<string ,bool> 作為 visit 陣列。
5s 都t了。百度了才知道這題要用康託展開作為visit陣列。
- 網上居然還有一種東西叫 八數碼的八大境界,感興趣的可以自行搜尋一下。
- 我看了一下我果然在第一重境界。我用map + stl 來做八數碼問題,
9! = 362880
使用map作為visit陣列,map的內部實現是紅黑樹,訪問和查詢的時間都是log(n)
,log(362880) <6
, 使用這種方式實現 visit陣列,程式執行的時間複雜度為n*log(n) < 6 * 362880 = 2177280
10e7
的時間複雜度,還是有點搞不懂為什麼5s也會t ?
相關推薦
Eight HDU - 1043 bfs+康託展開
這題是一道裸的八數碼問題,用 0 表示空格,相當於一共有9個數字,012345678,9個數字共9!種排列。 剛開始我使用map<string ,bool> 作為 visit 陣列。 5s 都t了。百度了才知道這題要用康託展開作為visit陣列。 網上居然還有一種東
HDU_1043 Eight 【逆向BFS + 康託展開 】【A* + 康託展開 】
一、題目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二、兩種方法 該題很明顯,是一個八數碼的問題,就是9宮格,裡面有一個空格,外加1~8的數字,任意一種情況,如果能通過移動空格使數碼組成 1 2 3 4 5 6 7 8 0 的形式,就輸
藍橋杯 歷屆試題 九宮重排 (bfs+康託展開去重優化)
Description 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從
HDU_1430 魔板 【BFS+康託展開+置換】
一、題面 POJ1430 二、分析 該題與之前做的八數碼不同,它是一個2*4的棋盤,並且沒有空的區域。這樣考慮的情況是很少的,依然結合康託展開,這時康託展開最多也只乘7的階乘,完全可以BFS先預處理一遍。 這裡需要注意,在處理的時候,仔細讀題,他的二維變一維的順序是順時針一遍讀過來的。 預處理完後,
Eight HDU - 1043 八數碼問題 康託展開 + 反向 bfs +記錄路徑
bfs 剪枝要點 visit陣列 hash函式(康託展開) 記憶化 bfs 打表儲存所有可達路徑 優先佇列 periority queue 多點同時bfs 反向bfs + bfs 打表儲存所有路徑 stl + 正向bfs
HDU 3567 Eight II 【bfs預處理】【八碼問題】【康託展開】
Eight II Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 130000/65536 K (Java/Others) Total Submission(s): 4477 Accepted Submi
1043 八數碼問題 康託展開 + 反向 bfs +記錄路徑
bfs 剪枝要點 visit陣列 hash函式(康託展開) 記憶化 bfs 打表儲存所有可達路徑 優先佇列 periority queue 多點同時bfs 反向bfs + bfs 打表儲存所有路徑 stl + 正向bfs 9! 一共有
hdu1043 Eight(A*/雙向BFS/單項BFS打表+康託展開)
題意描述:經典八數碼問題,給定八數碼的初始序列,求經過u、r、l、d四種操作到達1 2 3 4 5 6 7 8 x的狀態,打印出操作序列? 解題思路:A*/雙向BFS/單項BFS打表+康託展開 202msAC 方法一:BFS逆向打表+康託展開:從1 2 3 4 5
hdu 1034 & poj 1077 Eight 傳說中的八數碼問題。真是一道神題,A*演算法+康託展開
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13506 Accepted Submiss
藍橋杯 歷屆試題 九宮重排 (八數碼問題--康託展開去重 + bfs搜尋)
題意: 簡單的八數碼問題: 給你兩個狀態 求最少步數。 可以把點變成9: 這樣,9個數都不一樣,相當於是階乘的排列。 直接用bfs 搜尋 康託展開去重即可。 #include <cstdio> #include <cstring> #include
1043(逆向搜尋bfs+康拓展開)
傳送門 題意:給出一個初始的八數碼的狀態,然後問經過那些步驟可以轉化到八數碼的排列狀態 題解:首先需要了解一下康拓展開是個啥,那麼進入傳送門(大神的程式碼可以先不看),然後瞭解了這個黑科技後呢,就得考慮如何實現的問題了,多組資料,如果對於每一個狀態我們都"正向"進行一次b
[Sicily 1150 1151 1515 魔板] BFS+判重(康託展開)
1150、1151、1515都是魔板的題目,只是資料規模以及一些操作不同,1515的步數上限N最大會達到100。所以,我選擇直接解決1515魔板C。這樣就相當於同時解決了1150、1151、1515 (1)魔板狀態以及對應操作序列的儲存 定義一個struct結構體,該結構
【雜湊!簡】康託展開與逆康託展開
康託展開是利用全排列與當前排列次序的對映建立一個簡易雜湊表 康託展開 ans=a0*(n-1)!+a1*(n-2)!+····+an*(n-n)! 找了半天解釋, 就是ai表示剩下的數字中小於當前該數的個數,然後乘以剩下的數字的階乘 意思也就說,剩下的數字中小於當前該
LeetCode - Permutations(全排列、康託展開 Cantor expansion)- 題目 31、46、47、60、77
31. Next Permutation 46. Permutations 47. Permutations II 60. Permutation Sequence 77. Combinations 這五道題是LeetCode上關於數列的全
【康拓展開&逆康託展開】
百度百科就夠了 自己的體會: 康託展開是基於比他小的前面的個數來進行計算的 另外康託展開也是一個數組到一個數的對映,因此也是可用於hash,用於空間壓縮。比如在儲存一個序列,我們可能需要開一個數組,如果能夠把它對映成一個自然數
康託展開與逆康託展開模板(O(n^2)/O(nlogn))
O(n2)方法: 1 namespace Cantor { 2 const int N=100; 3 int fac[N]; 4 void init() { 5 fac[0]=1; 6 for(int i=1; i<N
初學康託展開和逆康託展開
這篇部落格講的相當清楚了,轉載一下 1、簡述 康託展開是一個全排列到一個自然數的雙射,常用於構建hash表時的空間壓縮。設有n個數(1,2,3,4,…,n),可以有組成不同(n!種)的排列組合,康託展開表示的就是是當前排列組合在n個不同元素的全排列中的名次。
(數論十一)康託展開與逆康託展開
一.引出康託展開 動態規劃題有一類分支叫狀壓DP,意思就是把狀態壓縮為一個二進位制陣列,然後轉為十進位制數儲存。一般n的大小不會超過20,因為20個狀態的組合就有2^20,也就是1e6種可能。 對於一些題目,緊緊利用狀態壓縮,會發現狀態的組合數遠遠超過1
我排第幾個——康託展開
描述 現在有"abcdefghijkl”12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的? 輸入第一行有一個整數n(0<n<=100
搜尋_先進先出佇列BFS_康託展開HDOJ1043_Eight
點此開啟題目頁面 Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it