手链样式
题目描述
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num=0;
vector<string>vis; //存已经计数过的玛瑙串
string str = {"aaabbbbccccc"};//表示玛瑙串
do
{
int has = 0;
for(int i = 0;i<vis.size();i++)
{
if(vis[i].find(str)!=string::npos) //查找不到返回string::npos
{
has=1;
break;
}
}
if(!has)//遇到没有计数过的就计数
{
num++;
string temp = str;
temp = temp+temp; //因为玛瑙串是一个环,所以保存两倍长的玛瑙串便于进行判断
vis.push_back(temp);
reverse(temp.begin(),temp.end());
//因为玛瑙串可以随意反转,所以应该保存下反转的串,例如"123456"和“654321”是同一串玛瑙串
//而上面那个是扩展两倍,“123456”会保存为"123456123456"是查不出"654321"所以要反转一下。
vis.push_back(temp);
}
}while(next_permutation(str.begin(),str.end()));
cout<<num<<endl;
}
版权声明:本文为Stillboring原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。