sicily上面的三道「簡單魔板」的變形,開始以為資料變大了第一道題的解法行不通了,其實不然。網上看到用康托展開來進行儲存狀態的,發現其實對於這道題沒能發揮康托展開的強大威力。
下面是找到別人的**,自己加了一些注釋(嗚嗚,我不想剽竊的。。。只是**不了。。)
原文出處
其實這道題沒必要使用康托編碼,這裡沒發揮它的強大作用。因為從開始狀態往下一層一層的搜不會出現太多的狀態(試了下1000000步
也只是一萬多種狀態而已,所以康托編碼沒太多作用對於這道題)
1 #include2 #include3 #include4 #include5
using
namespace
std;
6struct
board724
};25
intn;
26int x[4],y[4
];27
board q;
28bool isvisit[50000];//
用於搜尋某狀態是否曾經出現過
29int fact=;//
8的階乘表
30//
康托展開
31int
encode(board p)
3241
for(int i=0;i<7;i++) //
真正的康托展開在這裡開始
4248
return
sum;49}
50//a51
void
a(board p)
5263//b
64void
b(board p)
6576//c
77void
c(board p)
7889
bool
equal(board p)
9098
return
true;99
}100
void
bfs()
101125
if(equal(p))
126130
a(p);
131if(!isvisit[encode(q)])
132136
137b(p);
138if(!isvisit[encode(q)])
139143
144c(p);
145if(!isvisit[encode(q)])
146150
}151
}152
153int
main()
154162
return0;
163 }
Sicily 1150 簡單魔板(BFS)
此題可以使用bfs進行解答,使用8位的十進位制數來儲存魔板的狀態,用bfs進行搜尋即可 1 include 2 using namespace std 34 int op a int n 910 int op b int n 1920 int op c int n 26int ans a 0 100...
簡單魔板 Special judge
description 魔板由8個大小相同方塊組成,分別用塗上不同顏色,用1到8的數字表示。其初始狀態是 1 2 3 4 8 7 6 5 對魔板可進行三種基本操作 a操作 上下行互換 8 7 6 5 1 2 3 4 b操作 每次以行迴圈右移乙個 4 1 2 3 5 8 7 6 c操作 中間四小塊順時...
1449 例題2 魔板
題解這道題是一道非常典型的bfs題目,bfs所面臨的最大問題是判斷重複。顯然,如果每次判 斷重複都掃瞄一次佇列,搜尋的效率將非常低,會提高乙個指數級,所以一般寬度搜尋的判斷重複 都是運用陣列來實現的,那麼陣列下標就需要用乙個hash函式來計算出來。本題hash函式的設計 我們很容易想到將8個數字按順...