魔方(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個魔方 來組成魔方牆,這是一件非常巨大,而且是很耗物力 財力和人力的活兒,在計算機技術和顯示技...