您的位置:首页 > 编程语言 > C语言/C++

贝格尔编排法之C++版

2015-09-04 18:16 399 查看
轮转的步骤与之前的java代码不同,相对之前的更高效一些。

//
#include <iostream>
#include<vector>
using namespace std;
void display(vector<int> arrays,int len){
for(int i = 0;i<len/2;i++)
cout<<arrays[i]<<"....."<<arrays[len-i-1]<<endl;
}
int reset(vector<int> &arrays,int flag,int len){
if(flag==0)
flag = len -1;
else
flag = 0;
int temp = arrays[len -1];
arrays[len-1] = arrays[0];
arrays[0] = temp;
return flag;
}
void moveByWalk(vector<int> &arrays,int walk,int flag,int len){
int begin = len-flag-1;//begin为首次移动的位置,即flag对应的另外一个位置;
int index = begin;
int temp=0,lasttemp = arrays[index];
int mod = len-1;//空白位置不计入
for(int i=0;i<len-2;i++){
int nextpos = (index+walk)%mod;
temp = arrays[nextpos];
arrays[nextpos]= lasttemp;
index = nextpos;
lasttemp = temp;
}
//当flag=0时,最后一次赋值会赋给arrays[0],因为对len-1取余的原因,所以要单独赋值
arrays[begin] = lasttemp;
}
void compete(vector<int> arrays){
int len = arrays.size();
if(len &0x1 != 0){
arrays.push_back(0);
len++;
}
int flag =len-1;
int walk = len/2 -1;
int max = len-1;
for(int i =0;i <max;i++){
if(i>0){
flag = reset(arrays,flag,len);
moveByWalk(arrays,walk,flag,len);
}
cout<<"第"<<i+1<<"轮:"<<endl;
display(arrays,len);

}

}
int main () {
int num = 7;
vector<int> arrays;
for(int i=0;i<num;i++){
arrays.push_back(i+1);
}
compete(arrays);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: