蓝桥杯真题T1254

written by: 东篱下の悠然
题目链接:点我!

题目分析:题目就是要你输出这串珠子的所有排列方法中 分别有几种转法和翻转法…
那就好办咯~枚举一种排列方法—检查重复—将它旋转—翻转—枚举下一种排列方法…直到所有排列方法都列举一遍
此题用到了vector容器,并且是string类型的;next_permutation()是一个用来枚举全排列的函数,一般与do-while();结构搭配使用,代码奉上:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>//封装了全排列函数
using namespace std;
int main(){
	vector<string> a;
	string str = "rrrwwwwyyyyy";//假装这就是珠子 3红4白5黄
	int sum = 0;
	
	a.clear();//清空容器 现在容器为空
	do{
		vector<string>::iterator it;//定义容器的迭代器 名字叫it 实际上就是容器的专用指针
		for(it = a.begin(); it != a.end(); it++){//指针从头指到尾找一下有没有重复的情况
			if((*it).find(str, 0) != string::npos)//如果有重复,find函数返回it所指值在容器中的 位置;如果没有重复 没找到,find()函数返回一个标记npos
			break;
		}
		
		//此刻it中保留着重复值在容器中的位置 或 容器最底部的位置
		if(it != a.end()) continue;// it不在最底部,说明找到重复了 且已经分析过这种重复情况的翻转、旋转,跳过!
		
		//将每次得到的新串先复制拼接一下形成模拟旋转成环,再翻转一下,如果两次操作得到的串在容器中已得的串中没有,就入栈
		string str2 = str + str;//可任意旋转的缘故
		a.push_back(str2);//转动情况入栈
		reverse(str2.begin(), str2.end());//可任意翻转的缘故
		a.push_back(str2);//翻转情况入栈
		
		sum ++;
		
	}while(next_permutation(str.begin(), str.end()));//下一种全排列
	
	printf("%d\n", sum);
	return 0;
}

♥如有谬误还请指正~~蟹蟹♥
发布了9 篇原创文章 · 获赞 3 · 访问量 870

猜你喜欢

转载自blog.csdn.net/wenya13/article/details/104405327