藍橋杯 手鍊樣式 (枚舉)

description

小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。
他想用它們串成一圈作爲手鍊,送給女朋友。
現在小明想知道:如果考慮手鍊可以隨意轉動或翻轉,一共可以有多少不同的組合樣式呢?

solution

  • 手鍊可以轉動,所以存儲時將字符串加倍,這樣就可以找到轉動後的情況。
  • 手鍊可以翻轉,所以再存儲一下加倍後的字符串的reverse的字符串。
  • 枚舉方法,直接next_permutation,簡單粗暴。
#include <iostream>  // std::cout
#include <algorithm> // std::next_permutation, std::sort
#include <string>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    string str = "aaabbbbccccc";
    vector<string> v;
    int cnt = 0;
    do
    {
        bool flag = true;
        for (int i = 0; i < v.size(); i++)
            if (v[i].find(str) != string::npos)
            {
                flag = false;
                break;
            }
        if (!flag)
            continue;
        string str2 = str + str;
        v.push_back(str2);
        string str_rev;
        for (int i = str2.size() - 1; i >= 0; i--)
            str_rev += str2[i];
        v.push_back(str_rev);
        cnt++;
    } while (next_permutation(str.begin(), str.end()));
    cout << cnt << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章