魔方 大模擬

2021-08-09 02:21:24 字數 2015 閱讀 8931

魔方(cube.cpp)

題目描述:

給出乙個二階魔方,保證 n 步以內能夠還原。「還原」被定義為每個面均為純色。

請給出,操作編號字典序最小,且不存在同類操作相鄰,的還原方案。

輸入格式:

第一行乙個正整數n,表示最多步數。

接下來24個整數,按上圖的順序依次給出ci,ci∈。

輸出格式:

一行,t個用空格隔開的正整數,表示復原的最小字典序操作序列,要求0 < t ⩽ n。

最後乙個數後無空格,資料保證輸入魔方是打亂的。

注:(1,2,3) 雖然長度長於(2,3),但字典序更小。

樣例讀入:

2

1 1 1 1

4 4 2 2

6 6 3 3

3 3 6 6

5 5 5 5

4 4 2 2

樣例輸出:

2

樣例解釋:

因為不能類別相同的操作相鄰,所以只有2種操作方式可以在兩步內復原此時的魔方:(2),(17),故字典序最小的為(2)。

資料範圍:

對於 20% 的資料,保證 n = 1

對於 40% 的資料,保證 n ⩽ 3

對於另20%的資料,保證 n ⩽ 6,且保證答案只用到前6種操作

對於100% 的資料,保證 n ⩽ 7

題解:一開始看到資料範圍還以為是狀態壓縮,將魔方的每個狀態表示出來,結果發現不對。其實就是大模擬,如果每次列舉18個操作,時間複雜度是o(n^18),顯然會超時,只能拿60分。其實不難發現,不管怎樣,答案中的操作只能在1~9之間,比如底面順時針90度=頂面順時針270度,底面180度=頂面180度,底面270度=頂面90度。所以只用列舉一面即可,於是就ac了。

#include #include #include #include using namespace std;

int n;

int tag[20];

int work[30],flag=0,opt[30];

int fa=0;

unsigned long long get_hash()

void init()

void change_(int id)

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9: }}

void dfs(int dep,int last)

if(cct) break;

} if(!cct)

{ flag=1;dep--;

for(int i=1;i

東東轉魔方(模擬)

東東有乙個二階魔方,即2 2 2的乙個立方體組。立方體由八個角組成。魔方的每一塊都用三維座標 h,k,l 標記,其中h,k,l 六個面的每乙個都有四個小麵,每個小麵都有乙個正整數。對於每一步,東東可以選擇乙個特定的面,並把此面順時針或逆時針轉90度。請你判斷,是否東東可以在乙個步驟還原這個魔方 每個...

HDU 5983 模擬魔方 模擬

題意是說給定乙個 2 2 魔方的各個面的情況,問是否能轉動不超過一次使得魔方復原。思路是先在輸入的時候統計一下已完成的面數,要想以最多一次的轉動使得魔方復原,那麼已完成的面數只能是 2 面或者 6 面,此處可剪枝。若已完成 6 面,那麼一定可以復原 若已完成 2 面,則要用一次轉動完成其他六面,開始...

最強大腦魔方牆模擬程式(工具)

今天沒事做,看了下綜藝節目 最強大腦 看後還是很震撼的,除了挑戰者的特異功能,也被主辦方的場景布置所驚呆。在該期中,最令人印象深刻的莫過於魔方牆。在現場,主辦方通過在場地擺設450x450 色塊 22500個魔方 來組成魔方牆,這是一件非常巨大,而且是很耗物力 財力和人力的活兒,在計算機技術和顯示技...