20190801 bfs判重 魔板

2022-05-01 13:30:09 字數 1928 閱讀 6066

洛谷2730魔板

在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有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個字元。

1/*2

如何判斷重複狀態??如果每一位列舉的話就太慢了,而且耗空間;

3那麼可不可以用八進位制數來存呢?也不行,這樣陣列開的太大,會爆空間;

4於是我們用康托展開,康托就是某數所在全排列中的排序

5bfs少不了queue啦

6這裡queue存的是上一狀態的編號,這裡另外使用了乙個編號

7然後列舉三種操作,判斷去重後,記錄他的編號,上一狀態編號,當前狀態步數以及達到當前狀態的操作,加入佇列即可

8最後達到目標狀態遞迴輸出即可 9*/

10 #include11 #include12

using

namespace

std;

13struct

node

14start,goal,c[500005

];17

intgoalnum,startnum;

18int v[500005

];19

int jc[9] = ;

20int step[500005],fa[500005],cnt,op[500005

];21 queue< int>q;

22int

kangtuo(node x)

2337

}38 res += midres * jc[8 -i];39}

40return

res;41}

42 node change(int k,int

u)43

50else

if(k == 2)51

56else

if(k == 3)57

64return

res;65}

66void print(int

x)67

74void

bfs()

7597

q.push(cnt);98}

99}100}

101}

102int

main()

103116 c[++cnt] =start;

117 step[cnt] = 0

;118 fa[cnt] =cnt;

119 op[cnt] = 0

;120 q.push(1

);121

bfs();

122return0;

123 }

BFS 雜湊 Magic Squares 魔板

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

AcWing1107 魔板 利用bfs

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

Sicily 1150 簡單魔板(BFS)

此題可以使用bfs進行解答,使用8位的十進位制數來儲存魔板的狀態,用bfs進行搜尋即可 1 include 2 using namespace std 34 int op a int n 910 int op b int n 1920 int op c int n 26int ans a 0 100...