枚举排列

今天我们来学习一些轻松的东西,全排列,这个东西应该还是非常的基础的,所以这里我们就不用再对他多做太多解释了,这里直接上一道题和一个标程,大家练习一下其实就可以了。

题目传送门:P1706 全排列问题

标程如下:

#include<bits/stdc++.h>
using namespace std;
bool x[12];
int xx[13];
int n;
void p_search(int a)
{
	if(a==n+1)
	{
		for(int i=1;i<=n;++i)
		{
			printf("%5d",xx[i]);
		}
		printf("\n");
		return;
	}
	for(int i=1;i<=n;++i)
	{
		if(!x[i])
		{
			xx[a]=i;
			x[i]=true;
			p_search(a+1);
			x[i]=false;
		}
	}
}
int main()
{
	cin>>n;
	p_search(1);
}

如果我们把这道题改一下,我们从n个数中选取m个数,然后并且保证他们都不一样,那么我们只需要把递归边界改一下,然后在改一下下面循环部分的内容就可以了

代码如下:

#include<bits/stdc++.h>
using namespace std;
bool x[12];
int xx[13];
int n,m;
void p_search(int a,int b,int m)
{
	if(a==m+1)
	{
		for(int i=1;i<a;++i)
		{
			printf("%5d",xx[i]);
		}
		printf("\n");
		return;
	}
	for(int i=b;i<=n;++i)
	{
		if(!x[i])
		{
			xx[a]=i;
			x[i]=true;
			p_search(a+1,i+1,m);
			x[i]=false;
		}
	}
}
int main()
{
	cin>>n>>m;
	p_search(1,1,m);
}

谢谢采纳!

posted @ 2020-07-17 16:25  Mudrobot  阅读(158)  评论(0编辑  收藏  举报