題解這道題是一道非常典型的bfs題目,bfs所面臨的最大問題是判斷重複。顯然,如果每次判
斷重複都掃瞄一次佇列,搜尋的效率將非常低,會提高乙個指數級,所以一般寬度搜尋的判斷重複
都是運用陣列來實現的,那麼陣列下標就需要用乙個hash函式來計算出來。
本題hash函式的設計:我們很容易想到將8個數字按順時針順序組合成8進製(每個數字都
減1)的8位基數。但是,這裡最大的八進位制數76543210,轉換成十進位制數是16434824,也就是說要
開大小為16434824的陣列,如果題目強制空間限制,那麼,陣列的下標會越界
這裡我們引入康托展開,即將乙個排列對應成它在全排列中的序數,這樣就不會mie了
引入康托展開
設step[ ]記步數;記 i 的父結點為prt[ i ] ; a[ i ]表示第i個序列採用哪種變換。
**
#include#include#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int jc[10]=;
int g,st,prt[50005],b[1000001]=,step[50005
];char a[50005
];struct
mbstart,goal,q[
90001
];int turn(mb x) //
康托展開
return
res;
}
mb change(
int way,int num) //
三種操作
if(way==2) //b
if(way==3) //c
}void print(int num) //
遞迴出結果
void
bfs()}}
op++;}}
intmain()
bfs();
return0;
}
sicily 簡單魔板2
sicily上面的三道 簡單魔板 的變形,開始以為資料變大了第一道題的解法行不通了,其實不然。網上看到用康托展開來進行儲存狀態的,發現其實對於這道題沒能發揮康托展開的強大威力。下面是找到別人的 自己加了一些注釋 嗚嗚,我不想剽竊的。只是 不了。原文出處 其實這道題沒必要使用康托編碼,這裡沒發揮它的強...
1423 例題2 種樹
題解 思路點撥 首先按照區間的結束位置從小到大排序。然後從區間1到區間n進行選擇 對於當前區間,若集合中的數不能覆蓋它,則將區間末尾的數加入集合 貪心策略 取最後乙個。種樹要種得少,就要使一棵樹給多個區間使用。這樣,盡量在重疊區間種樹即可,而重疊位置一定是在區間尾部。處理問題時,先按所有區間的結束位...
1441 例題2 生日蛋糕
題解 也就是說第m層蛋糕的半徑最小為m,高最小也是m 此時第一層蛋糕半徑和高都是1保證第m層最小 1.for int i m i i m n i i表示的是半徑的範圍 2.for int j m i i j n j j表示的是高的範圍 3.if i i 2 i j 這一步表示的是只有我們在列舉到這個...