2019 bls的算法設計課02-全排列

全排列是啥

在這裏插入圖片描述

代碼

#include <bits/stdc++.h>
using namespace std;
void permutation(int a[], int k, int m)
{
	int i, j;
	if (k == m)
	{
		for (i = 0; i < m; i++)
			cout << a[i];
		cout << endl;
	}
	else
	{
		for (j = k; j < m; j++)
		{
			swap(a[j], a[k]);
			permutation(a, k + 1, m);
			swap(a[j], a[k]);
		}
	}
}

int main()
{
	int a[1000];//如果要排字典序 改成char a[1000]就行
	int n;
	while(cin>>n)
	{
	for(int i=0;i<n;i++) cin>>a[i];
	permutation(a, 0, n);
	}

	return 0;
}

函數單拎出來:

void permutation(int a[], int k, int m)
{
	int i, j;
	if (k == m)//這裏很好理解,就是當換到最後一個的時候就該輸出本次排列結果了
	{
		for (i = 0; i < m; i++)
			cout << a[i];
		cout << endl;
	}
	else
	{
		for (j = k; j < m; j++)
		{
			swap(a[j], a[k]);
			permutation(a, k + 1, m);
			swap(a[j], a[k]);
		}
	}
}

(憨批)過程

每層交換的順序就是:我換我自己,我換我後面的,我換我後面的後面……這樣;
比如

1234,a[0]換a[0]— a[1]換a[1] — a[2]換a[2] — a[3]換a[3] —換完了輸出1234
還原也是1234(a[3]換a[3])
a[3]換完了

a[2]還能換a[3] 變成1243
(還原爲1234)
a[2]換完了

a[1]換a[2] 變成1324
再a[2]換a[3] 1342
(還原爲1324)
a[1]換a[3] 變成1423
再a[2]換a[3] 1432
(還原爲1423)–> 1324–>1234
a[1]換完了

a[0]換a[1] 變成 2134
然後就是循環 換自己 換自己後面 換自己後面的後面……
最後a[0]換完了

底下這張圖我真是不想看 md畫圖弱者地瓜
在這裏插入圖片描述真的我好像個弱智啊…???
怎麼畫清晰易懂的圖解???
考試的時候回來還看得懂???

有幾個要注意的

1.每次進入perm(k+1)的時候其實是沒有換的,因爲i=k;
2.perm(3)就相當於要輸出了,因爲交換等於沒換,進入perm(4),就 j==k 輸出了;
3.返回上一層時的狀態並不都是1 2 3 4 (這個應該都知道吧)(手算的時候不要記錯就行)

next_permutation()

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100];
int main()
{
    int n;
    while(cin>>n)
    {

        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        do
        {
            for(int i=0;i<n;i++)
            {
                cout<<a[i]<<' ';
            }
            cout<<endl;
        }while(next_permutation(a,a+n));
    }
}

全排列什麼的只要用next_permutation()函數就好了…
萬一實驗考試考了呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章