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()函数就好了…
万一实验考试考了呢?

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