實現代碼:
#include<iostream>
using namespace std;
const int maxNumber = 5;
void Perm(int list[], int direct[], int number){
int num = number;
int index = -1;
while (num > 0){
//尋找num的下標
for (int i = 0; i < number; i++){
if (list[i] == num){
index = i;
break;
}
}
//判斷num是否的活動數
if (direct[num - 1] == 0 && index == 0){
num--;
}
else if (direct[num - 1] == 0 && index > 0){
if (list[index] > list[index - 1]){
int temp = list[index];
list[index] = list[index - 1];
list[index - 1] = temp;
for (int i = 0; i < number; i++){
cout << list[i] << " ";
}
cout << endl;
//改變所有比num要大的數的方向
for (int i = num; i < number; i++){
direct[i] = direct[i] ^ 1;
}
//重置num
num = number;
}
else{
num--;
}
}
else if (direct[num - 1] == 1 && index == number - 1){
num--;
}
else if (direct[num - 1] == 1 && index < number - 1){
if (list[index] > list[index + 1]){
int temp = list[index];
list[index] = list[index + 1];
list[index + 1] = temp;
for (int i = 0; i < number; i++){
cout << list[i] << " ";
}
cout << endl;
//改變所有比num要大的數的方向
for (int i = num; i < number; i++){
direct[i] = direct[i] ^ 1;
}
//重置num
num = number;
}
else{
num--;
}
}
}
}
int main(void){
int list[maxNumber];
int direct[maxNumber];
for (int j = 0; j < maxNumber; j++){
list[j] = j + 1;
//direct對於的是每個數的方向,0爲向左,1爲向右
direct[j] = 0;
}
for (int i = 0; i < maxNumber; i++){
cout << list[i] << " ";
}
cout << endl;
Perm(list, direct, maxNumber);
return 0;
}