問題
b: 魔板(
usaco3.2.5)
題目描述
在成功地發明了魔方之後,拉比克先生發明了它的二維版本,稱作魔板。這是一張有
8個大小相同的格仔的魔板:
1 2 3 4
8 7 6 5
我們知道魔板的每乙個方格都有一種顏色。這
8種顏色用前
8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構成乙個顏色序列。對於上圖的魔板狀態,我們用序列(1,
2,3,
4,5,
6,7,
8)來表示。這是基本狀態。
這裡提供三種基本操作,分別用大寫字母
「a」,
「b」,
「c」來表示(可以通過這些操作改變魔板的狀態):
「a」:交換上下兩行;
「b」:將最右邊的一列插入最左邊;
「c」:魔板**四格作順時針旋轉。
下面是對基本狀態進行操作的示範:
a: 8 7 6 5
1 2 3 4
b: 4 1 2 3
5 8 7 6
c: 1 7 2 4
8 6 3 5
對於每種可能的狀態,這三種基本操作都可以使用。
你要程式設計計算用最少的基本操作完成基本狀態到目標狀態的轉換.
輸入 輸入僅一行,包括
8個整數,用空格分開(這些整數在
1~8之間),表示目標狀態。 輸出
輸出檔案包括乙個整數,表示最短操作序列的長度。
樣例輸入
2 6 8 4 5 7 3 1
樣例輸出
7
思路:廣搜,用map記錄每個到達過的狀態,直至達到目標狀態
**:
#include#define ll long long
using namespace std;
mapmp;
struct dds,e;
queueq;
int k,ek;
void bfs()
//b操作
s.a[1]=q.front().a[4];s.a[2]=q.front().a[1];s.a[3]=q.front().a[2];s.a[4]=q.front().a[3];
s.a[5]=q.front().a[6];s.a[6]=q.front().a[7];s.a[7]=q.front().a[8];s.a[8]=q.front().a[5];
k=0;
for(int i =1; i <= 8; i++)
k=k*10+s.a[i];
if(!mp[k])
//c操作
s.a[1]=q.front().a[1];s.a[2]=q.front().a[7];s.a[3]=q.front().a[2];s.a[4]=q.front().a[4];
s.a[5]=q.front().a[5];s.a[6]=q.front().a[3];s.a[7]=q.front().a[6];s.a[8]=q.front().a[8];
k=0;
for(int i =1; i <= 8; i++)
k=k*10+s.a[i];
if(!mp[k])
//判定是否達到目標
if(mp[ek])
q.pop();
}return;
}int main()
魔板問題(搜尋)
時間限制 1 sec 記憶體限制 64 mb 提交 23 解決 6 提交 狀態 討論版 命題人 admin 題目描述 據說能使持有者成為世界之主的上古神器隱藏在魔板空間,魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,按順時針方向依次寫下各方塊的顏色代號,例如序列 1,2,3,4,5,6,7,8...
魔板問題的分析與解答
描述在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有8個大小相同的格仔的魔板 1 2 3 4 8 7 6 5我們知道魔板的每乙個方格都有一種顏色。這8種顏色用前8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構成乙個顏...
問題 1176 魔板 借鑑 注釋版
時間限制 1sec 記憶體限制 128mb 在魔方風靡全球之後不久,rubik先生發明了它的簡化版 魔板。魔板 由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1 8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示 從魔板的左上角開始,按順時針方 向依次寫下各方塊的顏色代號,所得到的數字序...