手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
请你提交该整数。不要填写任何多余的内容或说明性的文字。
结果填空不需要太在意时间复杂度,几秒十几秒出都能接受。
这个题,主要运用stl中的string.find(str),next_permutation(str.begin(),str.end()),reverse(str.begin,str.end())。
在一个vector中存下已经出现过的排列,每一个排列先在vector中查找是否已存在该排列,若不存在,则res++,并将str+str(可任意转动)和reverse(str.begin(),str.end()) (可任意翻转) 压入vector。这样的话,比较花时间,但是可以接受。
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; vector<string> vec; int main() { string str="AAABBBBCCCCC"; int res=0; do { int flag=1; for(int i=0;i<vec.size();i++) { if(vec[i].find(str)!=string::npos) { flag=0; break; } } if(flag) { res++; string tmp=str+str; vec.push_back(tmp); reverse(tmp.begin(),tmp.end()); vec.push_back(tmp); } }while(next_permutation(str.begin(),str.end())); cout<<res<<endl; return 0; }