蓝桥杯省赛2015——手链样式

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

一开始的错误想法:把圆形手链变成链状,以红色为第一颗珠子。计算十二颗珠子以红色为起点有多少种组合方式,再除以三得到。
然后很显然是错误的,虽然错误原因我也不是很清楚,可能是没有考虑翻转?

后来看了一下老师的讲解视频,感觉可以学习的小点还挺多
【完整代码】

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
 string s="aaabbbbccccc";
 vector<string> v1;
 int ans=0;
 do{
  int i = 0;
  for(;i<v1.size();++i){
   if(v1[i].find(s)!=string::npos)break; //找到了,说明重复了
  }
  if(i!=v1.size())continue;
  string s2=s+s;
  v1.push_back(s2);
  reverse(s2.begin(),s2.end());
  v1.push_back(s2);
  ans++;
 }while(next_permutation(s.begin(),s.end()));
 cout<<ans<<endl;
 return 0;
}

【笔记】
1、全排列方法(永远记不住!希望下次可以记得住)
在do语句块中不能改变s!!!不然会退出循环

#include<algorithm>
do{}
 while(next_permutation(s.begin(),s.end()));

2、v1为vector类型,判断字符串s是否为v1中某个字符串的子字符串,string:npos表示没找到

for(int i=0;i<v1.size();++i){
   if(v1[i].find(s)!=string::npos)break;
  } 

3、判断s1是否为s的旋转 等价于 s1是否为s+s的子字符串

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值