題目描述:
小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。
他想用它們串成一圈作為手鍊,送給女朋友。
現在小明想知道:如果考慮手鍊可以隨意轉動或翻轉,一共可以有多少不同的組合樣式呢?
請你提交該整數。不要填寫任何多餘的內容或說明性的文字。
解答:定義字串str="aaabbbbccccc"代表手鍊的串接情況,對該字串進行全排列,找到其中滿足條件的,順便刪除重複的情況,重複只要包括兩張情況,轉動和反轉
轉動是指手鍊轉動時,各個珠子的順序會依次發生變化,例如aaabbbbccccc和aabbbbccccca就是同一種情況,判斷某個情況是否是之前已經計算過的某種情況,我們採取二倍字串的方式,例如在第一次遇見aaabbbbccccc時,我們把它存入答案列表中,之後對於每種情況,都搜尋答案列表,並把列表中的字串乘二,依次判斷答案列表中的答案是否各當前要判斷的情況是一種情況。例如當前答案列表在已經有了aaabbbbccccc,我們遇到了aabbbbccccca,要判斷aabbbbccccca是否已經和答案列表中的某個答案重複了,我們依次遍歷列表,並將其中字串*2.當搜尋到aaabbbbccccc,我們先把它*2,變成s=aaabbbbcccccaaabbbbccccc,然後判斷aabbbbccccca是否為s的字串,若是,則說明aabbbbccccca和aaabbbbccccc是同一種情況,重複了,刪去。若遍歷完整個列表,發現aabbbbccccca不是答案列表中任何字串的二倍的子串,則該情況是一種新情況,加入答案列表即可。
反轉是指,aaabbbbccccc和cccccbbbbaaa是同一種情況,因為順時針轉和逆時針轉的結果一樣,對於這種情況,每當我們把乙個新情況存入答案列表中時,都要把它的反轉串也存入答案列表,但只計一次數,字串的反轉功能可以通過vector的reverse函式來實現
**如下:
#include#include#include#include#includeusing namespace std;
vectors;
int sum=0;
string str="aaabbbbccccc";
int ifsub(string s1,string s2);
int check(string s1);
int main()
while(next_permutation(str.begin(),str.end()));
cout《答案:
河南省藍橋杯第六屆省賽 6 牌型種數
題目描述 小明被劫持到x賭城,被迫與其他3人玩牌。一副撲克牌 去掉大小王牌,共52張 均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出乙個問題 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?請填寫該整數,不要填寫任何多餘的內容或說明文字...
藍橋杯第六屆省賽 手鍊樣式
手鍊樣式 小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。他想用它們串成一圈作為手鍊,送給女朋友。現在小明想知道 如果考慮手鍊可以隨意轉動或翻轉,一共可以有多少不同的組合樣式呢?全排列,對每種情況轉動,翻轉檢測 include include include include include using n...
河南省第六屆省賽 探尋寶藏 dp
time limit 1 sec memory limit 128 mb submit 59 solved 26 submit status web board 傳說hmh大沙漠中有乙個m n迷宮,裡面藏有許多寶物。某天,dr.kong找到了迷宮的地圖,他發現迷宮內處處有 寶物,最珍貴的寶物就藏在右...