排列的生成

标题:排列的生成

题目描叙:
Description
输出P(n,m)的排列(n,m<=10)
Input n,m
Output 每方案!

Sample Input
3 2

Sample Output
1 2
1 3
2 1
2 3
3 1
3 2

算法分析:本题完全属于数学排列问题,用搜索与回溯(search),本题与全排列基本相同,全排列是如果选的个数大于n
(如果不知道全排列的请看https://blog.csdn.net/bigwinner888/article/details/99655231 )就输出;而排列的生成是如果搜够了输入要求的个数(m)就输出!

输入(input):

void input(){cin>>n>>m;}

搜索(search):

void search(int x)
{
	if(x>m)  //判断是否已经搜个要求的个数 
	{
		print();  //输出
		return;
	}
	else
	{
		for(int i=1;i<=n;i++)   //循环遍历扩展数(分支)
		{
			if(!f[i])
			{
				f[i]=1;
				a[x]=i;
				search(x+1);
				f[i]=0;
			}
		}
	}
}

输出(output):

void print()
{
	for(int i=1;i<=m;i++)
		cout<<a[i]<<' ';
	cout<<endl;
}

AC完整程序:

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,a[11];
bool f[11];
void print();
void search(int);
void input(){cin>>n>>m;}
void search(int x)
{
	if(x>m) 
	{
		print();
		return;
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			if(!f[i])
			{
				f[i]=1;
				a[x]=i;
				search(x+1);
				f[i]=0;
			}
		}
	}
}
void print()
{
	for(int i=1;i<=m;i++)
		cout<<a[i]<<' ';
	cout<<endl;
}
int main()
{
	input();
	search(1);
	return 0;
}

在这里插入图片描述
记得扣点赞和关注!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值