在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有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 之間),表示目標狀態。
【輸出格式】
line 1: 包括乙個整數,表示最短操作序列的長度。
line 2: 在字典序中最早出現的操作序列,用字串表示,除最後一行外,每行輸出60個字元。
sample input
2 6 8 4 5 7 3 1sample output
bcabccb
思路:魔板由1~8個數字組成,將8位數轉換成10進製,用雜湊表來儲存歷史訪問狀態,設定陣列flag[16777216](8的8次方)。
#include#includeusing namespace std;
int final[2][4];
int start[2][4]= ,};
int flag[16777216]= ;
struct node node;
void exchange(int &a,int &b)
void opa(int a[2][4])
void opb(int a[2][4])
}void opc(int a[2][4])
bool equal(int a[2][4],int r[2][4])
return true;
}int convert(int a[2][4])
for(i=3;i>=0;i--)
return num;
}void bfs()
return 0;
}
map做法 問題 D 寬搜入門 魔板
include include include include using namespace std struct node startnode,node map int,bool intmapbool int targetmatrix 2 4 tempmatrix 2 4 把matrix2對應的...
寬搜 A 按鈕
vasya 發現了乙個奇怪的裝置。在裝置的前面板上,有乙個紅色按鈕 乙個藍色按鈕和乙個顯示了某個正整數的螢幕。在按下紅色按鈕之後,裝置將顯示的數字乘以 2。在按下藍色按鈕之後,裝置將顯示的數字減去 1。如果在某時刻,數字不再是正數,則裝置終止執行。顯示螢幕可以顯示任意大的數字。初始狀態下,顯示螢幕顯...
簡單魔板 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操作 中間四小塊順時...