题目描述】
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有排列。
【输入】
一行两个自然数n、r(1<n<21,1≤r≤n)。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
int a[101],b[101];
int s,t;
void print(){
int i;
for(i=0;i<t;i++){
cout<<setw(2)<<a[i];
}
cout<<endl;
}
void search(int m){
int i;
for(i=0;i<s;i++){
if(!b[i]){
b[i]=1;
a[m]=i+1;
if(m==(t-1))
print();
else
search(m+1);
b[i]=0;
}
}
}
int main(){
cin>>s>>t;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
search(0);
return 0;
}
1、关于其中代码段,我犯了一个很严重的错误,将
void search(int m){
int i;
for(i=0;i<s;i++){
if(!b[i]){
b[i]=1;
a[m]=i+1;
if(m==(t-1))
print();
else
search(m+1);
b[i]=0;
}
}
}其中的b[i]=0;放到if语句的大括号外,这样的话,它会在b[i]=1的时候将你的b[i]改为0,举个例子,以1开头的排列,本该是b[0]=1;在递归到a[1]的时候,从0开始,查找没被标记的数字,发现b[0]被标记过,立马改为0,导致了错误。