数字排列(n,m)(搜索与回溯)

题目描述:

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

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
using namespace std;
int sum,a[100],b[100];
int search(int);
int print();
int n,r;
int main()
{
scanf("%d%d",&n,&r);//从n个数中选r个数;
search(1);//就是有r个位置,从n中个数选择数字来填,从第一个开始;
cout<<"number="<<sum<<endl;
return 0;
}
int search(int x)
{
for(int i=1;i<=n;i++)//有n种可能
{
if(!b[i])//如果没有被填过
{
a[x]=i;//第x个数是i
b[i]=1; //标志i已经填过;
if(x==r)print();//如果填完,输出
else search(x+1);//否则 填下一个
b[i]=0;//回溯
}
}
}
int print()
{
sum++;
for(int j=1;j<=r;j++)
cout<<setw(2)<<a[j];
cout<<endl;
}

 

posted @ 2017-03-23 14:01  ANhour  阅读(574)  评论(0编辑  收藏  举报