遞歸實現排列型枚舉--算法競賽進階指南

把 1~n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。

輸入格式
一個整數n。

輸出格式
按照從小到大的順序輸出所有方案,每行1個。

首先,同一行相鄰兩個數用一個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。

數據範圍
1≤n≤9
輸入樣例:
3
輸出樣例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

/*
主要思想:第一個位置枚舉每一個數字,再枚舉第二個位置,以此類推,以此枚舉,直到最後一個位置 
*/

#include <cstdio>
#include <iostream>


using namespace std;
int n;
int num[10];//0-沒有用下標的數字,1-使用了下標的數字 
int out[10];//下標代表位置,數字代表這個位置上的數字 

void dfs(int index)
{
	if(index == n)//枚舉到最後一個數字完成,輸出
	{
		for(int i = 0;i < n; i++)
		{
			printf("%d ",out[i]);
		}
		printf("\n");
		return;
	}
	
	for(int i = 0; i < n; i++)
	{
		if(num[i] == 0)//這個數字沒有使用 
		{
			num[i] = 1;//使用這個數字 
			out[index] = i+1; 
			dfs(index+1);//對下一個位置進行枚舉 
			num[i] = 0;//恢復現場 
		}
	}
}

int main()
{
	scanf("%d",&n);
	dfs(0);//從第一個位置開始 
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章