魔板問題(搜尋)

2022-09-18 13:27:16 字數 1453 閱讀 1792

時間限制: 1 sec  記憶體限制: 64 mb

提交: 23  解決: 6

[提交] [狀態] [討論版] [命題人:admin]

題目描述

據說能使持有者成為世界之主的上古神器隱藏在魔板空間,魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,按順時針方向依次寫下各方塊的顏色代號,例如序列(1,2,3,4,5,6,7,8)即代表圖所示的魔板狀態。

對於魔板可施加三種不同的操作,分別以a,b,c標識,具體操作方法如圖所示。

對於每種可能的狀態,這三種基本操作都可以使用。你要程式設計計算用最少的基本操作完成基本狀態到特殊狀態的轉換,輸出基本操作序列。

輸入只有一行,包括8個整數,用空格分開(這些整數在範圍 1~8 之間),表示目標狀態。

輸出第一行包括乙個整數,表示最短操作序列的長度。  

第二行在字典序中最早出現的操作序列,用字串表示,除最後一行外,每行輸出60個字元。 

複製樣例資料

2 6 8 4 5 7 3 1

樣例輸出
7

bcabccb

提示

樣例的輸入目標狀態是由bcabccb這7步操作獲得的,如圖所示。

map記錄每個狀態以及是否出現過,bfs跑一邊即可。

#include#include

#include

#include

using

namespace

std;

const

int maxn = 5e5 + 5

;map

digit;

mapcur;

queue

q;string

init, dis;

void swap(char &x, char &y)

intmain()

q.push(init),

digit[init] = 1

;

while (!q.empty())

tmp[

0] = u[3], tmp[1] = u[0], tmp[2] = u[1], tmp[3] = u[2], tmp[7] = u[4], tmp[6] = u[7], tmp[5] = u[6], tmp[4] = u[5

];

if (!digit[tmp])

tmp[

0] = u[0], tmp[7] = u[7], tmp[3] = u[3], tmp[4] = u[4], tmp[1] = u[6], tmp[2] = u[1], tmp[5] = u[2], tmp[6] = u[5

];

if (!digit[tmp])

}cout

<< cur[dis].length() << endl << cur[dis] <

return0;

}

HDU 1430 魔板 搜尋

by cxlove 起始狀態和目標狀態都已確定,而且狀態比較多,可以雙向bfs搞定,不過需要記錄路徑,不好寫,而且需要時間多。從amb的博文裡學到了預處理,由於是8種顏色,而且可以確定,就可以通過置換,把起始狀態轉換成12345678,目標狀態同時也置換。對於起點12345678,進行bfs,到所有...

魔板問題的分析與解答

描述在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有8個大小相同的格仔的魔板 1 2 3 4 8 7 6 5我們知道魔板的每乙個方格都有一種顏色。這8種顏色用前8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構成乙個顏...

問題 B 魔板(USACO3 2 5)

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