演算法 Cube painting (骰子塗色)

2021-10-03 05:45:47 字數 1714 閱讀 5981

題意:

給兩個骰子,每枚骰子每個面由紅(red),藍(blue),綠(green)三種顏色之一染色,可以把每枚骰子按照圖示方式編號,然後按照編號給出顏色順序,問這兩枚骰子能否通過旋轉變成展示的顏色相對位置一致?

思路:

可以將一枚骰子的顏色順序不變,將另一枚旋轉,看旋轉過程中是否有顏色完全重合的情況。

旋轉時,每個面都可以在編號1的位置,這有6種選擇,而當編號1位置的面確定了,那麼編號6位置的面也就隨之確定了。剩下的只需將編號1和編號6之間的四個豎著的面旋轉,依次比較看是否有完全重合的情況,這時有4種情況,所以一共是24種選擇。

那麼難點就是如何列舉。以123456為例看一下它的剩餘三種情況是怎樣的。很容易得到:135246,15432,142536.

可以看到從第二種情況開始,每種情況的

第二個位置的數字由上一種情況的第三個位置數字得到,

第三個位置的數字由上一種情況的第五個位置數字得到,

第五個位置的數字由上一種情況的第四個位置數字得到,

第四個位置的數字由上一種情況的第二個位置數字得到。

那麼只需要確定6個面每個面在最頂面的一種情況,則這個面在最頂面的其餘情況就可得了。(列舉)

用乙個二維陣列記錄六個面每個面在最頂面的一種情況,而後列舉時,用相應迴圈的i,j呼叫初始情況,再在這種頂面確定時,列舉四種情況。當然也可以先比較然後列舉三種情況比較,這樣也是將所有情況都列舉完了。

難點:

①當頂面和底面確定時,繞豎直軸旋轉時,各個面是如何變化的。

②第一層次的6種情況如何表示。

#include

#include

char s[15]

, s1[7]

, s2[7]

, s3[7]

;int flag;

int d[7]

[7]=

,,,,

,};int

main()

s1[6]

='\0'

; s2[6]

='\0'

;// "封底"

//puts(s1);

//puts(s2);

for(

int i =

0;i <

6;i++

)// 以 1-6分別為底

for(

int j =

0;j <

3;j++

)//這時首尾顏色不變,只變化中間四種顏色(剩餘的三種排序序列) }if

(flag)

break

;// 匹配成功,跳出迴圈 }if

(flag)

printf

("true\n");

// 匹配成功

else

printf

("false\n");

// 失敗

}return0;

}

No 4 Cube painting (骰子塗色)

題目就不貼上了,注意變化的次數,不要總是改變。另註明 原題中一次性輸入12個顏色改為了分兩次輸入顏色 include include using namespace std void swap char a,char b void top int x,int y,char b 6 else if x...

牛客每日練習 購物,骰 的遊戲,有趣的數學

在遙遠的東方,有一家糖果專賣店。這家糖果店將會在每天 一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果 為c i j 元。現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。因為最多隻生產m個 買來糖果以後,你可以選擇吃掉糖果或者留著之後再吃。...

演算法基礎( 演算法)

演算法基礎 演算法 hash演算法有兩種,即sha 1和md5演算法這裡先介紹md5演算法.md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。首先,將訊息填充到比512...