标题:排列的生成
题目描叙:
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;
}
记得扣点赞和关注!!!