求排列(全排列问题)

求排列

设有n个整数的集合{1,2,…,n}(n<13),从中取出任意r个数进行排列(r<n),试列出所有的排列。

输入

n,r

输出

以由小到大的字典序输出n(1<=n<=9)

样例输入

3 3

样例输出

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 

(这题知道dfs模板就会呀。。。)

代码:

#include <bits/stdc++.h>
using namespace std;
int n,r;
int a[101];
bool v[101];
void dfs(int k)
{
	if(k==r+1)
	{
		for(int i=1;i<=r;i++)
		{
			cout << a[i] << ' ';
		}
		cout << "\n";
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(v[i]==false)
		{
			a[k]=i;
			v[i]=true;
			dfs(k+1);
			v[i]=false;
		}
	}
}
int main()
{
	cin >> n >> r;
	dfs(1);
	return 0;
}

那么 (咳咳

延伸一道题吧

全排列问题

输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入

n(1<=n<=9)

输出

由1~n组成的所有不重复的数字序列,每一行一个序列,每个数字前4个空格。

样例输入

3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

则:

#include <bits/stdc++.h>
using namespace std;
int a[101],n;
bool v[21];
void dfs(int k)
{
    if(k == n+1)
	{
		for(int i=1;i<=n;i++)
		{
			cout << a[i] << " ";
		}
		cout<<endl;
		return;
	} 
	for(int i=1;i<=n;i++)
	{
		if(v[i]==false)
		{
			a[k] = i;
			v[i] = true;
			dfs(k+1);
			v[i] = 0;
		}
	}  
}
int main()
{
	cin>>n;
	dfs(1);
}
posted @ 2023-03-07 19:48  Momo·Trace  阅读(73)  评论(0编辑  收藏  举报