魔板問題的分析與解答

2021-06-14 18:24:20 字數 2379 閱讀 5000

描述在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有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 之間)不換行,表示目標狀態。

第一行: 包括乙個整數,表示最短操作序列的長度。 第二行: 在字典序中最早出現的操作序列,用字串表示,除最後一行外,每行輸出60個字元。

2 6 8 4 5 7 3 1
7 

bcabccb

時間限制:1000ms

********************===我是華麗的分割線********************===

1、資料輸入是順時針的,正確把資料放入陣列後,後續的三種操作都可以正常進行

2、題目要求的是從基本狀態走向目標狀態,而非還原操作

1、需要構建乙個類儲存資訊,包含2個資料成員:走到這一步最短的步驟,該陣列的康托展開

2、需要康托函式和逆康托函式,將陣列集成為乙個數表示當前狀態,配合雜湊表快速查詢該狀態是否已經抵達過

3、abc三種操作分別封裝為函式,讀入乙個康托數,解析成陣列進行變換,然後封裝為康托數return

4、利用佇列進行廣度優先搜尋

#include #include #include #include using namespace std;

int cantor(int arr); // 康托函式

void uncantor(int x,int arr); // 逆康托函式

// 三種操作函式,讀入乙個康托數

int a(int a);

int b(int a);

int c(int a);

// 存放階乘

int fac[9];

struct moban

// 康托數從0開始,用-1避免衝突

};int main()

, biao;

// i, j, k 迴圈變數 r 步數

// t[8]記錄輸入的資料

// zhun開始的基本狀態 biao 儲存基本狀態對應的康托數

bool flag = true, hash[50000] = ;

// 計算階乘,為康托函式服務,背得出的也可以自己直接寫

fac[0] = 1;

for (i=1; i<=8; ++i)

fac[i] = fac[i-1] * i;

// 讀入資料,注意順時針

for (i=0; i<4; ++i)

cin >> t[i];

for (i=7; i>3; --i)

cin >> t[i];

// 計算目標康托數

biao = cantor(t);

// 將基本狀態入隊

moban a("", cantor(zhun));

q.push(a);

while (flag) // 開始搜尋

cout << endl;}}

if (flag)

if (!hash[a2])

if (!hash[a3])

}} }

system("pause");

return 0;

}int cantor(int arr)

{ int i, j, t, ans=0;

for (i=0; i<7; ++i)

{ t=0;

for (j=i+1; j<=7; ++j)

if (arr[j]

魔板問題(搜尋)

時間限制 1 sec 記憶體限制 64 mb 提交 23 解決 6 提交 狀態 討論版 命題人 admin 題目描述 據說能使持有者成為世界之主的上古神器隱藏在魔板空間,魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,按順時針方向依次寫下各方塊的顏色代號,例如序列 1,2,3,4,5,6,7,8...

問題 B 魔板(USACO3 2 5)

問題 b 魔板 usaco3.2.5 題目描述 在成功地發明了魔方之後,拉比克先生發明了它的二維版本,稱作魔板。這是一張有 8個大小相同的格仔的魔板 1 2 3 4 8 7 6 5 我們知道魔板的每乙個方格都有一種顏色。這 8種顏色用前 8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔...

問題 1176 魔板 借鑑 注釋版

時間限制 1sec 記憶體限制 128mb 在魔方風靡全球之後不久,rubik先生發明了它的簡化版 魔板。魔板 由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1 8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示 從魔板的左上角開始,按順時針方 向依次寫下各方塊的顏色代號,所得到的數字序...