手链样式

小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?


注意下面查找字串和全排列的操作,这里需要注意 string s, s.find(*iter) != s.end() 会报错
而且还不能用 auto 定义变量,emmm

所以要学会如何定义迭代器 , 对于 vector 可以这样定义:` vector ::iterator iter = ans.begin() ·


next_permutation(s.begin(),s.end()) 的返回值为bool类型,直接改变了 s 的内容, reverse 也是直接改变 s 的内容,输入的参数都是首尾迭代器。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<iterator>

using namespace std;


int main(){
    vector<string> ans;
    
    string s ="aaabbbbccccc";
    ans.push_back(s);
    int i = 0;
    while(next_permutation(s.begin(),s.end())){
//      cout << i++ <<endl;
        //检测是否含有,这个技巧可以有 
        string s2 = s+s;
        int flag = 0;
        for(vector<string>::iterator iter = ans.begin();iter!=ans.end();iter++){
            if(s2.find(*iter) != string::npos) {
                flag = 1;break;
            }
        }
        if(flag) continue;
        //检测是否可以反转
        reverse(s.begin(),s.end()) ;
        for(vector<string>::iterator iter = ans.begin();iter!=ans.end();iter++){
            if(s2.find(*iter)!= string::npos) {
                flag = 1;break;
            }
        }
        if(!flag) ans.push_back(s),cout << ans.size()<<endl;; 
    }
    
    cout << ans.size() <<endl;

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wei-huan/p/10586155.html