回溯算法之n个整数全排列
问题描述
设有n个整数的集合{1,2,…,n},从中取出任意r个数进行排列(r<n),试列出所有的排列。
算法分析
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
using namespace std;
int num=0,a[10001]={0},n,r;
bool b[10001]={0};
int search(int); //回溯过程
int print(); //输出方案
int main(){
cout<<"input n,r:";
cin>>n>>r;
search(1);
cout<<"number="<<num<<endl; //输出方案总数
}
int search(int k){
int i;
for (i=1;i<=n;i++)
if (!b[i]) { //判断i是否可用
a[k]=i; //保存结果
b[i]=1;
if (k==r)
print();
else
search(k+1);
b[i]=0;
}
}
int print(){
num++;
for (int i=1;i<=r;i++)
cout<<setw(3)<<a[i];
cout<<endl;
}