15年第六届蓝桥杯第七题_手链样式_(stl_string)


手链样式

小明有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;
}
原文地址:https://www.cnblogs.com/jasonlixuetao/p/6667767.html