递归实现排列型枚举
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入
一个整数n。
输出
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1≤n≤9
输入样例:
3
输出样例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
已AC代码
#include<stdio.h>
int num[1000];
int a;
void f(int b,int c){
if(b==a){
for(int i=0;i<a;i++){
printf("%d ",num[i]);
}
printf("\n");
return;
}
else{
for(int i = 1;i<=a;i++){
if (!((c>>i)&1)){
num[b++]=i;
f(b,c|1<<i);
b--;
}
}
}
}
int main(){
scanf("%d",&a);
f(0,0);
return 0;
}
注意点
1、f(x,y)——x代表已遍历到第x个数,y是一个二进制数,用状态压缩的方法记录这每个数的使用情况——0和1代表是否被使用过
2、递归为:x递归加一,y记录状态,当x加到n,则输出
3、!((c>>i)&1:该语句用位运算的方法判断是否用过i数据
4、f(b,c|1<<i);:该语句负责记录i数据已经被用过,且进行下一次循环
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103350.html