題意:
給兩個骰子,每枚骰子每個面由紅(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...