ぜんはいちもんだいかい


【mie hahahaのブログ】転載は出典を明記してください(感謝!):https://blog.csdn.net/qq_40315080/article/details/87937373
タイトルはn個の異なる元素の中からm(m≦n)個の元素を任意に取り、一定の順序で並べて、n個の異なる元素の中からm個の元素を取り出す配列と呼ばれ、m=nの場合、すべての配列状況を全配列と呼ぶ.
入力入力正の整数n(n<10)
出力はこのn個の整数で形成できるすべての配列を辞書順に与え,各行に1つの配列を与える.
例入力3
出力例123,132,213,231,312,321
コード:
#include
#include
#include
using namespace std;
int result[1000000],l=0;//      result       
void swap(int &a,int &b)
{
	int temp=a;
	a=b;
	b=temp;
}
void Perm(int num[],int start,int end,int oldstart,int oldend)
{
	if(start==end)//             ,           
	{
		long long number=0;
		int element=pow(10,oldend-oldstart);
		for(int i=0;i<=end;i++)
		{
			number=number+num[i]*element;
			element=element/10;
		} 
		result[l]=number;
		l=l+1;
	}
	else//             
	{
		for(int i=start;i<=end;i++)//for                    
		{
			swap(num[start],num[i]);
			Perm(num,start+1,end,oldstart,oldend);
			swap(num[start],num[i]);//        ,         
		}
	}
}
int main()
{
	int n;
	cin>>n;
	int num[n];
	for(int i=0;i

【注意:例によって、題名は並べ替え結果が小さいから大きいまで出力することを要求する】
【result配列で配列結果を数値的に記録して並べ替えて出力するのではなく、Perm関数の判断start=?endで直接要素を順次出力し、小さいものから大きいものへの出力を保証できない】
再帰を使用して、Perm関数は配列numのstartとendセグメントを再帰的に操作します.3プロセスの例を入力します.
初期num 1 2 3 start=0,end=2
Perm関数へ
判断start≠end、forループ①に入り、配列の1番目の位置(対123,1,1に交換)num 1 2 3に1つずつ交換してPerm関数start=1,end=2を呼び出してstart≠endを判断し、forループ②(対23,2,2に交換)num 1 2 3に入ってPerm関数start=2を呼び出し、end=2はstart=endを判断し、計算はこのとき配列結果が数字1 2 2 3に続いてループ②
(23,3,2に対して交換)num 1 3 2はPerm関数start=2,end=2を呼び出してstart=endと判断し,このときの配列結果を計算すると数字1 3 2サイクル②1ラウンド終了,交換戻りnum 1 2 3サイクル②終了,継続サイクル①
(対123,2,1交換)num 2 1 3 Perm関数start=1,end=2はstart≠endと判断してforループ③(対13,1,1交換)num 2 1 3はPerm関数start=2を呼び出し,end=2はstart=endと判断し,計算結果は数字2 1 3はループを継続する③
(対13,3と1交換)num 2 3 1はPerm関数start=2を呼び出し,end=2はstart=endと判断し,このときの配列結果を数字2 3 1サイクル③1ラウンド終了,交換戻りnum 1 2 3サイクル③終了,継続サイクル①
(対123,3,1交換)num 3 2 1 Perm関数start=1,end=2はstart≠endと判断してforループ③(対21,2,2交換)num 3 2 1はPerm関数start=2を呼び出し,end=2はstart=endと判断し,計算結果は数字3 2 2 1がループを続ける③
(対21,1,2交換)num 3 1 2はPerm関数start=2を呼び出し,end=2はstart=endと判断し,このときの配列結果を数字3 2 1サイクル③1ラウンド終了,交換戻りnum 1 2 3サイクル③終了サイクル①終了
result配列に記録された配列結果の数字は、打つから小さい配列に印刷すればよい.
最終結果:123,132,213,231,312,321
注意:エレメントに重複するエレメントがある場合は、現在のエレメントと先頭エレメントを再帰的に交換してそのエレメントを先頭エレメントとして使用する場合に、そのエレメントが重複しているかどうかを判断し、重複している場合は、その後の残りのエレメントを完全に配列しない(次のエレメントを直接参照)、重複していない場合は続行します.
間違いがあれば、指摘を歓迎します.