题目:输入两个正整数n和m,构造一个长度为n+m的字符串,正好含有n个字母A和m个字母B,且这个字符串不能存在连续三个相同的字符,输出任意一个满足条件的字符串即可
实现思路,先得到前n个为字符A后m个为字符B的字符串,然后对这个字符串随机排序(随机排序参考了这篇文章https://blog.youkuaiyun.com/cighao/article/details/49072111),判断排序后的字符串是否满足连续性的要求,不满足则重新进行随机排序。
源程序
#include<iostream>
#include<string>
#include<vector>
#define MAX 20000
using namespace std;
struct element{ //用来排序的数据结构
int data; // 数据
int index; // 序号
};
void rand_of_n(int a[],int n); //产生 1-n 的随机排列并存到 a[] 中
int cmp(const void *a,const void *b); //升序排列
vector<string> hebing(vector<string> _s1,vector<string> _s2);//获取满足条件的序列
bool lianxu(vector<string> _ss);
int main()
{
int n,m;
cin>>n>>m;
if(3*m<n||3*n<m)
return 0;
vector<string> AA(n,"A");
vector<string> BB(m,"B");
vector<string> hebinghou=hebing(AA,BB);
cout<<endl;
for(size_t i=0;i<hebinghou.size();i++){
cout<<hebinghou[i];
}
cout<<endl;
}
vector<string> hebing(vector<string> _s1,vector<string> _s2){
int N=_s1.size()+_s2.size();
vector<string> temp(_s1);
temp.insert(temp.end(),_s2.begin(),_s2.end());
int a[N];
vector<string> string_hebing;
//不断产生随机序列,知道满足条件为止
while(1){
string_hebing.clear();
rand_of_n(a,N);//产生一个随机顺序
for(int i=0;i<N;i++){
string_hebing.push_back(temp[a[i]-1]);
}
if(!lianxu(string_hebing)){
break;
}
//cout<<"new circle!\t";
}
return string_hebing;
}
void rand_of_n(int a[],int n){
int i;
struct element ele[MAX];
srand((int)time(0)); // 初始化随机数种子
for(i=0;i<n;i++){
ele[i].data=rand(); // 随机生成一个数
ele[i].index=i+1;
}
qsort(ele,n,sizeof(ele[0]),cmp); //排序
for(i=0;i<n;i++){
a[i]=ele[i].index;
}
}
int cmp(const void *a,const void *b){ // 升序排序
return((struct element*)a)->data - ((struct element*)b)->data;
}
bool lianxu(vector<string> _ss){
for(int i=0;i<_ss.size()-2;i++){
if(_ss[i]==_ss[i+1]&&_ss[i+1]==_ss[i+2]){
return 1;
}
}
return 0;
}
缺点:没有应用任何限制来产生随机排序,当n和m较大时,耗时可能较长。