1 #include<iostream>
2 using namespace std;
3 //初始化,注意两边的初始化,简化算法
4 void Init(int n , int *arr , bool * flags)
5 {
6 arr[0] = 0xfffffff;
7 for(int i = 1;i <= n;i++)
8 {
9 arr[i] = i;
10 flags[i] = false;
11 }
12 arr[n+1] = 0xfffffff;
13 }
14 //检查是否有可移动的地方
15 bool HaveMove(const int * arr ,const int iLength , int & iIndex ,const bool * flags , bool & bTemp)
16 {
17 int iMax = -1;
18 int iTemp;
19 for(int i = 1 ;i <= iLength ;i ++)
20 {
21 if(flags[i] == false && arr[i] > arr[i-1] && arr[i] > iMax)
22 {
23 iTemp = i;
24 iMax = arr[i];
25 bTemp = false;
26 }
27 else if(flags[i] == true && arr[i] > arr[i+1] && arr[i] > iMax)
28 {
29 iTemp = i;
30 iMax = arr[i];
31 bTemp = true;
32 }
33 }
34 if(iMax != -1)
35 {
36 iIndex = iTemp;
37 return true;
38 }
39 else
40 {
41 return false;
42 }
43 }
44 //相应的改变
45 void Move(int *arr ,int i , bool * flags , bool bTemp , int iLength)
46 {
47 int iTemp;
48 if( bTemp == false)
49 {
50 iTemp = flags[i];
51 flags[i] = flags[i-1];
52 flags[i-1] = iTemp;
53
54 iTemp = arr[i];
55 arr[i] = arr[i-1];
56 arr[i-1] = iTemp;
57 }
58 else
59 {
60 iTemp = flags[i];
61 flags[i] = flags[i+1];
62 flags[i+1] = iTemp;
63
64 iTemp = arr[i];
65 arr[i] = arr[i+1];
66 arr[i+1] = iTemp;
67 }
68
69 for(int i = 1;i <= iLength;i ++)
70 {
71 if(arr[i] > iTemp)
72 {
73 flags[i] = (flags[i] == false ? true : false);
74 }
75 }
76 }
77 void Show(const int * arr,int iLength)
78 {
79 for(int i = 1;i <= iLength ;i++)
80 {
81 cout<<(char)arr[i] <<' ';
82 }
83 cout<<endl;
84 }
85 //算法名称
86 void JonhnsonTrotter(int n)
87 {
88 int arr[100];
89 bool flags[100];
90 int iIndex;
91 bool bTemp;
92 Init( n , arr ,flags);
93
94 Show(arr , n);
95 while(HaveMove(arr, n , iIndex , flags , bTemp))
96 {
97 Move(arr ,iIndex , flags , bTemp , n);
98 Show(arr , n);
99 }
100 return;
101 }
102
103 int main()
104 {
105 int iNum;
106 cin>>iNum;
107 JonhnsonTrotter(iNum);
108 return 0;
109 }