蓝桥竞赛里没找见这道题,可能是我眼花了~
Question:
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
请你提交该整数。
不要填写任何多余的内容或说明性的文字。
Solve:
题目很简洁,说的官方一点就是一个包含重复元素的环排列问题
我看到有数学大佬直接推导出来了,确实牛啊~ 不过我不配
分析题目:
1.组合方式,首先是一个全排列,可以调用 c++ 的库函数 next_permutation 去实现
2.可以转动,也就相当于是一个环,可以将任意一个元素作为开头,我可以写一个循环去枚举每一 种转动状态,其中用到了 c++ 库函数 erase 和 insert
3.可以翻转,那就让它翻转咯,直接用 reverse 函数实现
4.去重,来个 string 类型的 set 就行
至于代码,有一段复用的,直接cv, 除了通俗易懂没有任何优点......
Code:
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
set<string>st;
string s = "aaabbbbccccc";
//全排列枚举函数
do{
bool ans = false;
string s1 = s;
//环形检测
for(int i = 1; i <= s.length(); i++){
string x = ""; x=x+s1[0];
s1.erase(s1.begin());
s1.insert(11, x);
if(st.find(s1) != st.end()){
ans = true; break;
}
}
//首尾翻转
reverse(s1.begin(), s1.end());
//环形检测
for(int i = 1; i <= s.length(); i++){
string x = ""; x=x+s1[0];
s1.erase(s1.begin());
s1.insert(11, x);
if(st.find(s1) != st.end()){
ans = true; break;
}
}
//未出现过的状态,插入
if(!ans) st.insert(s);
}while(next_permutation(s.begin(), s.end()));
//输出结果
cout <<st.size();
return 0;
}
最后附上蓝桥杯汇总链接:蓝桥杯C/C++A组省赛历年真题题解
声明:以个人刷题整理为目的,如若侵权,请联系删除~