递归实现排列型枚举(c语言)——全排列

递归实现排列型枚举

把 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数据

扫描二维码关注公众号,回复: 12917351 查看本文章

4、f(b,c|1<<i);:该语句负责记录i数据已经被用过,且进行下一次循环

猜你喜欢

转载自blog.csdn.net/weixin_48419914/article/details/112208261