C ++は配列要素の完全な配置を再帰的に見つけます-山東大学データ構造実験1

C ++は配列要素の完全な配置を再帰的に見つけます-データ構造実験1

最初のブログで、悪い文章があればコメント欄に投稿してください。
参照ブログ投稿
https://blog.csdn.net/a358463121/article/details/45543879

このコードは学校のデータ構造実験の要件に従って記述されているため、必須ではないコードが多数あり、必要に応じて変更できます。

主な実現アイデア:n個の要素の完全な配置を見つけるには、最初に各要素を順番に配置し、次に再帰的な方法を使用して残りのn-1個の要素をすべて配置し、再帰的に1つのInのみに配置します。要素の場合、すべての要素が出力されます。たとえば、3つの要素a、b、およびcの完全な配置を見つけるには、最初にaを最初に配置し、bとcを配置します。アレンジメントb、cは同じアイデアを使用し、最初にbをアレンジメントcに置きます。アレンジメント1を出力する方法は1つだけです:a、b、c。次に、cを最初に置いてbとcを交換します。出力配置2:a、c、b。そもそもaのすべての順列が出力されたら、a、bを交換し、bを最初に置き、すべての順列を出力します。類推により、すべての順列が出力されます。次の図は、個人的にプロセスを理解しやすいと考えています。データ構造とアルゴリズムのC ++実現教科書の伝説

以下は、特定の実装コードです(実験要件に従って記述されています)

/*
 2020年10月14日15:54:27
1、实验内容及目的: 
利用递归求所有元素的全排列 
实验要求: 
2、输入2-20个大于0的正整数(1、2、3或者100、200、300),输入0作为结束,0不参与排列。
输出这几个整数的全排列,每个数之间用半角“,”隔开,中间不要有空格,每个排列单独一行。
最后输出的一个数字后面不能有“,”。
3、运行样例: 
输入:3 2 1 0
输出:
Input
3
2
1
0
Output
3,2,1
3,1,2
2,3,1
2,1,3
1,2,3
1,3,2
end0 
*/ 
#include <iostream>
using namespace std;

void swap(int& a, int& b)      //定义交换两个数值的swap函数
{
    
     
    int temp = a;
    a = b;
    b = temp;
}
void perm(int list[], int low, int high)   //实现list数组中从low到high的全排列 
{
    
    
    if (low == high)               //当low==high时,此时list就是其中一个排列,输出list
    {
    
    
        for (int i = 0; i <= low; i++)
            {
    
    
            	
            	cout << list[i];
            	if(i!=low)       //当输出的不是最后一个元素时,输出“,” 
            		cout << ",";
			}
        cout << endl;
        
    }
    else 						//否则递归 
	{
    
    
        for (int i = low; i <= high; i++) //每个元素与第一个元素交换
        {
    
    
            swap(list[i], list[low]);
            perm(list, low + 1, high);   //交换后,得到子序列,用函数perm得到子序列的全排列
            swap(list[i], list[low]);    //最后,将元素交换回来,复原,然后交换另一个元素
        }
    }
}
int main()
{
    
    
    int len = 0;
    int *list;
    list = new int[20];
	cout << "Input" << endl;
	cin >> list[len];
     while (list[len] != 0)     //如果输入“0”则完成元素输入 
    {
    
    
    	len = len + 1;
    	cin >> list[len];
    }
    cout << "Output" << endl;
    perm(list, 0, len-1);
    cout << "end0";
    return 0;
}

おすすめ

転載: blog.csdn.net/m0_47470899/article/details/109077131