Luogu2578 ZJOI2005 九數碼遊戲

2022-07-24 00:30:37 字數 1027 閱讀 3073

狀態數不是很多,直接 bfs

輸出方案就記錄 pre 狀態即可

但是問題在於存狀態

可行的一些方案是:雜湊/map,康托展開

於是就學了一波康托展開

用康托展開的地方的地方感覺不會很多,畢竟要 n^2 算

大概意思就是給乙個排列 hash

計算出來的就是這個排列在所有 n 的排列中的排名

計算方式就從這裡看吧

不過**實現略有不同

大體思路是差不多的

逆展開就是當前這一位上的數字的排名

從可用數字中選出這個排名的數,並把它從可用集合中刪除

**:

#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 11, maxsiz = 5;

struct infobgn;

int ans, top;

int pi[maxn], out[maxn], tmp[maxn];

int stp[363000], pre[363000], stk[363000];

bool getans, vis[10];

queueq;

inline void turnmid(int *stt)

inline void turnroll(int *stt)

inline int expnd(int *dst)

return res;

}inline void antiex(int ex)

return;

}inline void write(int ex)

while(top)

return;

}inline void bfs()

if(stp[d2.ex] > d2.stp)

if(d1.ex == ans)

if(d2.ex == ans)

} return;

}int main()

洛谷P2578 ZJOI2005 九數碼遊戲

乙個有 神器 神奇操作的八數碼 直接逆向bfs,對於每種狀態,判重and記錄擴充套件到他的id,以及給他乙個id,搜到輸入的局面後,倒序輸出就行了 include include include include include includeusing namespace std struct em...

ZJOI 2005 夢幻摺紙

給乙個 n m 的網格圖,每個網格上有 1,n m 的數字,且每個都出現且恰好出現一次.顯然進行若干次摺疊直到剩下乙個 1 1 的小網格時,它在縱向上有 n m 層.那麼能否安排一種摺疊方案,使得這 n m 層從上往下的標號恰好為 1 到 n m 顯然每個縱向和橫向的格線都會被折到.我們觀察剩下的的...

luogu1110 ZJOI2007 報表統計

這裡的初始化就不講了,看完操作講解就應該明白了,再不行就去看 對於操作1 由於操作2的需要,vector n 存下數 對於操作2的維護 查詢相鄰兩個元素的之間差值 絕對值 的最小值 先把所有答案存入乙個小頭堆裡 比如 a,c之間你要插入b 那麼,你就要刪除 c a 然後加入 a b c b 之後的堆...