狀態數不是很多,直接 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 之後的堆...