排列問題的其中一種解法


實現代碼:

#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;
}



發佈了35 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章