AcWing1107 魔板 利用bfs

2021-10-05 20:32:17 字數 2060 閱讀 8164

rubik 先生在發明了風靡全球的魔方之後,又發明了它的二維版本——魔板。

這是一張有 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:魔板**對的4個數作順時針旋轉。

下面是對基本狀態進行操作的示範:

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 個整數,用空格分開,表示目標狀態。

輸出格式

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

如果操作序列的長度大於0,則在第二行輸出字典序最小的操作序列。

資料範圍

輸入資料中的所有數字均為 1 到 8 之間的整數。

輸入樣例:

2 6 8 4 5 7 3 1

輸出樣例:

7bcabccb

這道題用bfs是因為,bfs可以很好地儲存前乙個狀態,而dfs不太好!

儲存前乙個狀態利用pre[x][y] 陣列!

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1010

;char g[n]

[n];

unordered_mapint> dist;

unordered_mapchar

, string>> pre;

void

set(string start)

string get()

string move0

(string state)

string move1

(string state)

g[0]

[0]= v0, g[1]

[0]= v1;

return

get();

}string move2

(string state)

intbfs

(string start, string end)

; q.

push

(m[i]);

}}}return-1

;}intmain()

for(

int i =

1; i <=

8; i ++

) start +

=char

(i +

'0')

;bfs

(start, end)

; cout << dist[end]

<< endl;

int t = dist[end]

;

string res;

while

(start != end)

reverse

(res.

begin()

, res.

end())

;if(t) cout << res << endl;

return0;

}

AcWing1107 模板(bfs最小步數模型)

題目 rubik 先生在發明了風靡全球的魔方之後,又發明了它的二維版本 魔板。這是一張有 8 個大小相同的格仔的魔板 1 2 3 4 8 7 6 5我們知道魔板的每乙個方格都有一種顏色。這 8 種顏色用前 8 個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依...

簡單魔板 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操作 中間四小塊順時...

字尾陣列 魔板

為什麼一開始要再字串末尾多算個0呢 因為當開始分關鍵字比較的時候 最後要組成兩個 字元所以要多個0 什麼你有問我為什麼填0 因為0小啊 先處理唄 雖然 sa是根據每個字元確定的大小 也就是排布的每個字元的排名 但是在初次求第二關鍵字排序的時候 可以使用sa的結論 首先吧sa後面的0排到最前面 那麼0...