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

导读:本篇文章讲解 递归实现排列型枚举(c语言)——全排列,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

递归实现排列型枚举

把 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

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!