原理可以自己学习,实现如下,真的太久没用C++了。
#include<iostream>
#include<vector>
using namespace std;
struct jiedian
{
int zhi;
int dirct;
//dirct==0代表左边,dirct==1代表右边,
};
bool can_move(jiedian a[],int len){//判断是否存在可以移动的元素
vector<jiedian> move_list;
for (int i=0;i<len;i++)
{
if (a[i].dirct==0)
{
if (i-1>=0&&a[i-1].zhi<a[i].zhi)
{
move_list.push_back(a[i]);
}
}
else
{
if (i+1<=len-1&&a[i+1].zhi<a[i].zhi)
{
move_list.push_back(a[i]);
}
}
}
if (move_list.empty())
{
return false;
}
else return true;
}
vector<jiedian> search_max_index(jiedian a[],int len){//求可以移动的最大元素
vector<jiedian> move_list;
for (int i=0;i<len;i++)
{
if (a[i].dirct==0)
{
if (i-1>=0&&a[i-1].zhi<a[i].zhi)
{
move_list.push_back(a[i]);
}
}
else
{
if (i+1<=len-1&&a[i+1].zhi<a[i].zhi)
{
move_list.push_back(a[i]);
}
}
}
return move_list;
}
void Johnson_Trotter(jiedian a[],int n){
//打印初始序列
for (int dayin=0;dayin<n;dayin++)
{
cout<<a[dayin].zhi;
}
cout<<endl;
while (can_move(a,n))//存在可移动元素即执行
{
vector<jiedian> s_max=search_max_index(a,n);
int temp=s_max[0].zhi;
for (int i=0;i<s_max.size();i++)
{
if (s_max[i].zhi>temp)
{
temp=s_max[i].zhi;
}
}
for (int k=0;k<n;k++)//找最大元素并且移动
{
if (a[k].zhi==temp)
{
if (a[k].dirct==0)
{
jiedian temp1=a[k];
a[k]=a[k-1];
a[k-1]=temp1;
break;
}
else{
jiedian temp1=a[k];
a[k]=a[k+1];
a[k+1]=temp1;
break;
}
}
}
for (int j=0;j<n;j++){
if (a[j].zhi>temp)
{
if (a[j].dirct==1)
{
a[j].dirct=0;
}
else a[j].dirct=1;
}
}
for (int dayin=0;dayin<n;dayin++)
{
cout<<a[dayin].zhi;
}
cout<<endl;
}
}
int main()
{
jiedian a[6];
for (int i=0;i<6;i++)
{
a[i].zhi=i+1;
a[i].dirct=0;
}
Johnson_Trotter(a,6);
return 0;
}