手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
代码:
答案:1170
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
请你提交该整数。不要填写任何多余的内容或说明性的文字。
思路:由于可以翻转,那么将其扩大两倍,例如abcd,bcdabcda(中找abcd) 能找到就是一种情况
vector的用法: http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html
vector<int>::iterator it;//vector遍历元素的方法
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> v;//存已经找到的
int sum = 0;
string str = "aaabbbbccccc";
do
{
vector<string>::iterator it;
for(it=v.begin(); it != v.end(); it++)
{
//当寻找失败返回string::npos 值为4294967295
if((*it).find(str, 0) != string::npos)
{
break;
}
}
if( it != v.end() ) continue;
string str2 = str + str; //可以任意转动的缘故
v.push_back(str2);
reverse(str2.begin(), str2.end()); //可以任意翻转的缘故
v.push_back(str2);
sum ++;
}
while(next_permutation(str.begin(), str.end()));
cout << sum ;
}
答案:1170