1449 例題2 魔板

2022-04-12 03:39:08 字數 1260 閱讀 8013

題解這道題是一道非常典型的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 這一步表示的是只有我們在列舉到這個...