HDU1430 魔板 康托展開

2021-09-20 21:36:34 字數 2857 閱讀 3587

problem description

在魔方風靡全球之後不久,rubik先生發明了它的簡化版——魔板。魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1-8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示:從魔板的左上角開始,按順時針方向依次寫下各方塊的顏色代號,所得到的數字序列即可表示此時魔板的狀態。例如,序列(1,2,3,4,5,6,7,8)表示魔板狀態為:

1 2 3 4

8 7 6 5

對於魔板,可施加三種不同的操作,具體操作方法如下:

a: 上下兩行互換,如上圖可變換為狀態87654321

b: 每行同時迴圈右移一格,如上圖可變換為41236785

c: 中間4個方塊順時針旋轉一格,如上圖可變換為17245368

給你魔板的初始狀態與目標狀態,請給出由初態到目態變換數最少的變換步驟,若有多種變換方案則取字典序最小的那種。

input

每組測試資料報括兩行,分別代表魔板的初態與目態。

output

對每組測試資料輸出滿足題意的變換步驟。

sample input

12345678172453681234567882754631 

sample output

cac 

author ll

第一道康拓展開題,由於魔板的第二行,由於是逆向的,所以我處理的時候將其看做是擺正的

也就是而我處理的時候是

康拓展開的原理考研看這裡:

知道了原理之後,就不難解決了

#include

#include

#include

#include

#include

using

namespace

std;string start,end,ans[50000];int hash[10],pos[10],vis[50000];struct

node;int

solve

(string &s)

return sum;}void

fun_a

(string &s)

void

fun_b

(string &s)

void

fun_c

(string &s)

void

bfs()

t = a.str;        fun_b(t);        k = solve(t);        while(!vis[k])                t = a.str;        fun_c(t);        k = solve(t);        while(!vis[k])            }}int

main

()    return

0;}

problem description

在魔方風靡全球之後不久,rubik先生發明了它的簡化版——魔板。魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1-8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示:從魔板的左上角開始,按順時針方向依次寫下各方塊的顏色代號,所得到的數字序列即可表示此時魔板的狀態。例如,序列(1,2,3,4,5,6,7,8)表示魔板狀態為:

1 2 3 4

8 7 6 5

對於魔板,可施加三種不同的操作,具體操作方法如下:

a: 上下兩行互換,如上圖可變換為狀態87654321

b: 每行同時迴圈右移一格,如上圖可變換為41236785

c: 中間4個方塊順時針旋轉一格,如上圖可變換為17245368

給你魔板的初始狀態與目標狀態,請給出由初態到目態變換數最少的變換步驟,若有多種變換方案則取字典序最小的那種。

input

每組測試資料報括兩行,分別代表魔板的初態與目態。

output

對每組測試資料輸出滿足題意的變換步驟。

sample input

12345678172453681234567882754631 

sample output

cac 

author ll

第一道康拓展開題,由於魔板的第二行,由於是逆向的,所以我處理的時候將其看做是擺正的

也就是而我處理的時候是

康拓展開的原理考研看這裡:

知道了原理之後,就不難解決了

#include

#include

#include

#include

#include

using

namespace

std;string start,end,ans[50000];int hash[10],pos[10],vis[50000];struct

node;int

solve

(string &s)

return sum;}void

fun_a

(string &s)

void

fun_b

(string &s)

void

fun_c

(string &s)

void

bfs()

t = a.str;        fun_b(t);        k = solve(t);        while(!vis[k])                t = a.str;        fun_c(t);        k = solve(t);        while(!vis[k])            }}int

main

()    return

0;}

hdu 1430 魔板 康拓展開 對映優化

給定三種操作,將排列a轉化為排列b,求最少步驟。這種題目可以只跑一次bfs,比如只跑 12345678 那麼如果遇到 23456781 某個字串呢?因為每乙個數字都是等價的,我們可以把2對映為1,3對映成2,以此類推。這樣就可以用 12345678 跑出來的操作序列了。include include...

HDU 1430 魔板 搜尋

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

HDU 1430(康拓展開hash)

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