题目描述
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共有多少不同的组合样式?
输出
请你输出该整数。不要输出任何多余的内容或说明性的文字。
解题思路:
因为这题的手链可以随意转动或翻转,假如我们的手链是1234,则转动的意思是,2341,3412,也属于一种情况,我们可以利用复制,解决转动的问题,比如我们将手链变成12341234,这样我们2341,3412都属于12341234的子串,所以只要找得到它的子串,则说明是一种情况,旋转则属于下面这种情况:
这属于一种情况,那么旋转要怎么解决呢?我们利用reverse函数就可以解决旋转的问题,比如12341234,旋转以后,为:43214321,我们把旋转后的情况也存进vector数组里面就行了,枚举情况可以用next_permutation函数。
知识点:
do—while语句中有continue关键字时,程序会跳到do—while语句的 }while() 处 ,然后判断while 是否满足条件,然后程序进行下一布的运行。
代码如下:
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
vector<string>v;
int ans;
vector<string>::iterator it;int main() {string str = "aaabbbbccccc";do {for (it = v.begin(); it != v.end(); it++) {if ((*it).find(str) != -1)//找不到会返回-1break;}if (it != v.end())continue;string str2 = str + str;v.push_back(str2);reverse(str2.begin(), str2.end());v.push_back(str2);ans++;} while (next_permutation(str.begin(), str.end()));cout << ans << endl;return 0;
}