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;
}