欢迎使用CSDN-markdown编辑器

一个简单的过滤策略

项目需求建模以后将一串1和0归并,要求满足变化次数和持续个数的限制

简单实现如下


#include <stdio.h>
#include <string>
#include <iostream>
#include "windows.h"
#include <stdlib.h>

using namespace std;
extern int checkone(string str,string str1);
extern int replacestr(string &changestr,string str1,string str2,int max);
int main()
{
    srand((unsigned)GetCurrentTime());   
    int num=72;
    int max=2;
    int st=4;
    int ot=4;
    /*生成运行结果*/
    string f_caStatus;
    f_caStatus="0";
    for(int i=0;i<num;i++){
    if(rand()%2==0){
        f_caStatus+="0";
    }
    else
    {
        f_caStatus+="1";
    }
    }

    f_caStatus+="0";
    f_caStatus="01110110111101010001011010010111001000010010100001110110110100110001010100";
    cout<<f_caStatus<<endl;

    string changestr=f_caStatus;
    int c=0;
    int ret=0;
    int o1=0;
    int o2=0;
    cout<<checkone(changestr,"01")<<endl;
    while(1){
        c++;
        ret=0;
        string one="1";
        string zero="0";
        string oner="1";
        string zeror="0";
        for(int i=0;i<c;i++){
            one+="0";
            zero+="1";
            oner+="1";
            zeror+="0";
        }
        one+="1";
        zero+="0";
        oner+="1";
        zeror+="0";
        if((c<ot)||(o1==0)){
        ret=replacestr(changestr,one,oner,max);
        if(ret==-1)
            o1=1;
        }
        if((c<st)||(o2==0)){
        ret=replacestr(changestr,zero,zeror,max);
        if(ret==-1)
            o2=1;
        }
        if((c>=ot)&&(o1==1)&&(c>=st)&&(o2==1))
            break;
    }

    cout<<f_caStatus.substr(1,num)<<endl;
    for(int i=0;i<num;i++){
    if(changestr[i]==49){
    cout<<"a";
    }
    else
    {
    cout<<"b";
    }
    }
    cout<<endl;
    cout<<changestr<<endl;
    getchar();
    return 0;
}

int checkone(string str,string str1)
{
    //str=str.substr(1,str.size()-2);
    int c=0;
    int pos=-2;
    int l=str1.size();
    while(str.size()>=l){
        pos=str.find(str1,pos+l);
        if(pos==-1)
            break;
        else{
        c++;
        }
    }
    return c;
}

int replacestr(string &changestr,string str1,string str2,int max)
{
    int c=0;
    int l=str1.size();
    int pos=-l;
    while(changestr.size()>=l){
        pos=changestr.find(str1,pos+l);
        if (pos!=-1)
        {
            changestr.replace(pos,l,str2);
            c++;
        }
        else if(c==0){
            break;
        }
        else if(c!=0){
            pos=-1;
            c=0;
            continue;
        }
    }
    if(checkone(changestr,"01")<=max)
    return -1;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值