轮转的步骤与之前的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);
}
这篇博客介绍了使用C++实现贝格尔编排法,相比Java版本,该实现更高效,详细阐述了轮转步骤。

1万+

被折叠的 条评论
为什么被折叠?



