最近卡了一下暴力求解,因为比较贪玩,所以进度比较缓慢,百度到的总看不太明白,又没人教,所以决定自己来写一个简单易懂的,毕竟不会这个的一般都是小白,这样和我类似情况的学弟学妹们看到了也能给他节省点时间。好了不说废话了,还是谈谈这类问题吧
一 枚举排列:
问题: 输出一段数的所有排列。
输入 3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
解析:
运用递归来解决问题,设置一个数组num用来保存答案,从num[0]开始,每一位从小到大的尝试填入所有的数,并且保证填入的这个数不会在同一个排列中被填两次,当填到最后一位时输出答案。
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
void print_permutation(int n,int *num,int cur){//在这里 cur 的值有两个作用。1 判断填了多少个数了. 2 将数填入num[cur]中。
if(cur==n){//因为填入第三个数之后会运行print_.....() 所以实际上在输出时cur=3但此时只有num[0]--num[2]有值
for(int i=0;i<n;i++)printf("%d ",num[i]);
printf("\n");
}
else for(int i=1;i<=n;i++){//循环填入cur值
int ok=1;//用来记录当前要填入的值i是不是重复了。
for(int j=0;j<cur;j++){//用来判断是不是已经有过了
if(i==num[j])ok=0;
}
if(ok){
num[cur]=i;//既然没有重复,那么就说明可以填,就填进去
print_permutation(n,num,cur+1);//判断下一位
}
}
}
int main(){
int num[15],n;
while(cin>>n,n){
for(int i=0;i<n;i++)num[i]=0;//清空数组
print_permutation(n,num,0);
}
}