題目鏈接:http://oj.ecustacm.cn/problem.php?id=1254
題目描述
小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。
他想用它們串成一圈作為手鏈,送給女朋友。
現在小明想知道:如果考慮手鏈可以隨意轉動或翻轉,一共有多少不同的組合樣式?
他想用它們串成一圈作為手鏈,送給女朋友。
現在小明想知道:如果考慮手鏈可以隨意轉動或翻轉,一共有多少不同的組合樣式?
輸出
請你輸出該整數。不要輸出任何多余的內容或說明性的文字。
思想:
暴力枚舉,我們直接把每一次得到的串先復制拼接一下(模擬旋轉)成環,再翻轉一下,如果兩次得到的串在已得的串里面沒有就加入
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 const int maxn = 1e5 + 10 ; const LL mod = 20010905; std::vector<std::string> v; int main() { std::string str = "aaabbbbccccc"; int sum = 0; do { std::vector<std::string>::iterator it; for (it = v.begin();it != v.end();it++) { if((*it).find(str, 0) != std::string::npos) { break; } } if (it != v.end()) continue; std::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())); printf("%d\n",sum); }