2019 bls的算法设计课02-全排列

本文介绍了全排列的概念,通过示例详细解释了全排列的生成过程,并探讨了next_permutation函数在实现全排列中的作用,强调了在理解和使用全排列算法时需要注意的几个关键点。
摘要由CSDN通过智能技术生成

全排列是啥

在这里插入图片描述

代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值