2017 第八屆藍橋杯 魔方狀態

2021-08-17 18:36:27 字數 2130 閱讀 8066

二階魔方就是只有2層的魔方,只由8個小塊組成。

如圖p1.png所示。

小明很淘氣,他只喜歡3種顏色,所有把家裡的二階魔方重新塗了顏色,

如下:前面:橙色

右面:綠色

上面:黃色

左面:綠色

下面:橙色

後面:黃色

請你計算一下,這樣的魔方被打亂後,一共有多少種不同的狀態。

如果兩個狀態經過魔方的整體旋轉後,各個面的顏色都一致,則認為是同一狀態。

請提交表示狀態數的整數,不要填寫任何多餘內容或說明文字。

開始拿到這道題沒什麼思路,筆算算不來,模擬判重感覺太麻煩。大神說burnside引理可以做,學渣表示看不懂。。網上基本沒有求解的,有的也答案不一。最後還是模擬判重這麼寫了。

我的答案:229878

測試:全同色魔方狀態為1,正確。正常二階魔方狀態3674160,正確。

思路:其實就是空間狀態搜尋。模擬操作+判重。關於操作,二階魔方只做u(頂層順時針) r(右層順時針) f(前層順時針)就可以得到所有狀態了。判重需要旋轉整個魔方去比較。(判重小白現在只會用set)。

然後是,怎麼去表示乙個二階魔方。二階魔方8個塊,乙個塊6面(看不見的作黑色考慮),所以我用了char st[8][7]去表示乙個魔方。塊的順序如下:

上面的初始狀態表示就是,,,,,,,}

o表示橙色,b表示黑色,g表示綠色,y表示黃色。

對於乙個小塊,6個面的顏色定義順序如下:

所以,比如說,上面題目給的魔方,前面一層,左上角的橙黃綠塊,表示就是oybbgb

#include using namespace std;

typedef char st[8][7];

st state[2000000];

setall;

st begin=,,,,,,,};

//st begin=,,,,,,,};

//只有乙個顏色的魔方 ans=1

//st begin=,,,,,,,};

//正常2階魔方狀態 r紅 y黃 b藍 g綠 w白 o橙 k黑(紅對橙,白對黃,藍對綠,顏色相近的相對)這裡白為底 前為紅

//需要將state大小改為4000000

//這個測試用例跑了20分鐘左右 560m記憶體 ans=3674160 與實際二階魔方狀態數相同 見下截圖

int front, tail;

void ucell(char *a)

void rcell(char *a)

void fcell(char *a)

void u(st &s)//頂層順時針旋轉

void uwhole(st &s)//整個魔方從頂部看 順時針轉 用於判重

void f(st &s)//前面一層 順時針轉

void fwhole(st &s)//整個魔方從前面看 順時針轉 用於判重

void r(st &s)//魔方右層順時針轉

void rwhole(st &s)//整個魔方從右邊看 順時針轉 用於判重

string convert(st &s)//魔方狀態二維字元陣列 轉化為string

bool try_to_insert(int tail)//判重

藍橋杯java第八屆第四題 魔方狀態

二階魔方就是只有2層的魔方,只由8個小塊組成。如圖p1.png所示。小明很淘氣,他只喜歡3種顏色,所有把家裡的二階魔方重新塗了顏色,如下 前面 橙色 右面 綠色 上面 黃色 左面 綠色 下面 橙色 後面 黃色 請你計算一下,這樣的魔方被打亂後,一共有多少種不同的狀態。如果兩個狀態經過魔方的整體旋轉後...

2017第八屆藍橋杯 分巧克力

簡單二分 題目 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同 例如一塊...

藍橋杯第八屆決賽

精神狀態不好的時候怎麼寫 真的哭了,一堆sb錯誤 對於16進製制,我們使用字母a f來表示10及以上的數字。如法炮製,一直用到字母z,就可以表示36進製。36進製中,a表示10,z表示35,aa表示370 你能算出 many 表示的數字用10進製表示是多少嗎?請提交乙個整數,不要填寫任何多餘的內容 ...