天天看點

94. 遞歸實作排列型枚舉

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

輸入格式

一個整數 nn。

輸出格式

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

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

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

資料範圍

1≤n≤91≤n≤9

輸入樣例:

3
           

輸出樣例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
           
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N = 10;
int n;
int sta[N];   //用來存數
bool us[N];  //判斷第i位數是否使用

void dfs(int u)   //u表示判斷sta數組第u位存什麼數
{
	if (u > n)//邊界 已全部指派完畢
	{
		for (int i = 1; i <= n; i++)
		{
			printf("%d ", sta[i]);
		}
		puts(" ");
		return;
	}
	
	
	for(int i=1;i<=n;i++)
	{ 
		//此時的每一位數是空 false
		if (!us[i] )   //循環 使得每都是未存個i放數列中的最小位
		{
			sta[u] = i;        //将數i存到下标位u的位置上,0表示不放
			us[i] = true;    //将數i标記為已使用過
			dfs(u + 1);      //進行下一位的判斷
			//恢複現場
			sta[u] = 0;
			us[i] = false;
		}
	}

}
int  main()
{
	scanf_s("%d", &n);
	dfs(1);
	return 0;
}
           

繼續閱讀