设有n个整数的集合{1,2,……,n},从中任意取出r个数进行排列(r<n),试着列出所有的排列。 题目含义可以简化从n个整数中取出r个数的全排列。
#include<iostream>
#include<cstdio>
#include<iomanip> //用到了setw
using namespace std;
int num=0,a[10001]={0},n,r; //n个数中取出r个
bool b[10001]={0}; //数组b[i]用来记录数字是否已经用过
int search(int );
int print();
int main()
{
cout<<"输入原始数据个数 和取出数据个数:";
cin>>n>>r;
search(1); //从第一个位置开始搜索
cout<<"排列数:"<<num<<endl;
return 0;
}
int search(int k )
{
int i;
for(i=1;i<=n;i++) //每一个位置都搜遍n个数
if(!b[i]) //前面未使用过
{
a[k]=i; //数组a 用来记录方案
b[i]=1; //更新b[i]表示数字i已经用过
if(k==r) print(); //找完r个数
else search(k+1);
b[i]=0;//回溯 继续下一种方案
}
}
int print()
{
num++;
for(int i=1;i<=r;i++)
cout<<setw(3)<<a[i];//定义输出宽度为 3
cout<<endl;
}