C语言数字全排列生成器

前言

从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。


提示:文章作者为初学者,有问题请评论指正,感谢。

这个代码的功能是生成并打印出从1到N的所有整数的全排列,并计算总共有多少种排列方式能想出这个代码的人也是个人才。0.o

#include <stdio.h>
#define N 3
int x[N];
int count = 0;

void dump() {
    int i = 0;
    for (i = 0; i < N; i++) {
        printf("%d", x[i]);
    }
    printf("\n");
}

void swap(int a, int b) {
    int t = x[a];
    x[a] = x[b];
    x[b] = t;
}

void run(int n) {
    int i;
    if (N - 1 == n) {
        dump();
        count++;
        return;
    }
    for (i = n; i < N; i++) { 
        swap(n, i);
        run (n +1);
        swap(n, i);
    }
}

int main() {
    int i;
    for (i = 0; i < N; i++) {
        x[i] = i + 1;
    }
    run(0);
    printf("* Total: %d\n", count);
    return 0;
}
  1. 全局变量定义:

    • int x[N]; 用于存储当前排列的一个数组,N为9,即数组长度为9。
    • int count = 0; 用于计数生成的全排列总数。
  2. 函数dump:

    • 功能是打印当前数组x的内容,即输出一个全排列。
  3. 函数swap:

    • 实现两个元素在数组x中的交换,用于在生成排列时进行元素位置的交换。
  4. 函数run (关键递归函数):

    • 输入参数 n 表示当前正在处理数组中的第n+1个位置。
    • n等于N-1时,说明已经填到了最后一个位置,调用dump函数打印当前排列,并将计数器count++,然后返回。
    • 否则,对于数组中从位置n开始的每个元素,都尝试将其放在当前位置n上,通过swap交换元素位置,然后递归调用run(n + 1)处理下一个位置。递归调用结束后,再次交换回来,恢复数组状态,这是回溯的过程,确保尝试所有可能的排列组合。
  5. 主函数main:

    • 初始化数组x,使其从1到9依次填充。
    • 调用run(0)开始递归生成全排列。
    • 最后,打印出总共生成的全排列数量,即count的值。

 当N=3时  整个代码的流程:

  1. main函数:

    • n = 0,调用run(0)
  2. run(0):

    • n = 0,基准情况未满足,进入for循环。
    • 第一次迭代:i = 0
      • 调用swap(0, 0),数组不变,因为没有交换。
      • 调用run(1)
        • n = 1,基准情况未满足,进入for循环。
        • 第一次迭代:i = 1
          • 调用swap(1, 1),数组不变,因为没有交换。
          • 调用run(2)
            • n = 2,基准情况满足,调用dump()打印[1, 2, 3]count++
            • 回溯,swap(1, 1),数组不变。
          • 第二次迭代:i = 2
            • 调用swap(1, 2),数组变为[1, 3, 2]
            • 调用run(2)
              • n = 2,基准情况满足,调用dump()打印[1, 3, 2]count++
              • 回溯,swap(1, 2),数组变为[1, 2, 3]
          • for循环结束,返回到run(1)
        • for循环结束,返回到run(0)
    • 第二次迭代:i = 1
      • 调用swap(0, 1),数组变为[2, 1, 3]
      • 调用run(1)
        • 与之前类似,但数组起始状态为[2, 1, 3]
    • 第三次迭代:i = 2
      • 调用swap(0, 2),数组变为[3, 1, 2]
      • 调用run(1)
        • 与之前类似,但数组起始状态为[3, 1, 2]
    • for循环结束,返回到run(0)

 图解

相关推荐

  1. 1215: 【C4】【搜索】【回溯】数字排列

    2024-06-12 15:16:01       15 阅读
  2. 数组排序C语言

    2024-06-12 15:16:01       31 阅读
  3. 排列c++代码

    2024-06-12 15:16:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 15:16:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 15:16:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 15:16:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 15:16:01       20 阅读

热门阅读

  1. 力扣-2225

    2024-06-12 15:16:01       6 阅读
  2. Lua 基础 05 时间

    2024-06-12 15:16:01       8 阅读
  3. leetcode刷题记录38-16. 最接近的三数之和

    2024-06-12 15:16:01       8 阅读
  4. 高低温测试发现文件被篡改

    2024-06-12 15:16:01       9 阅读
  5. 架构设计-如何安全地传输密码

    2024-06-12 15:16:01       5 阅读
  6. 【名词解释】Unity中的Scrollbar组件及其使用示例

    2024-06-12 15:16:01       7 阅读
  7. 大数据的定义特点与应用场景?

    2024-06-12 15:16:01       8 阅读
  8. 网络数据库后端面试题

    2024-06-12 15:16:01       8 阅读
  9. c++:回顾(一)

    2024-06-12 15:16:01       10 阅读
  10. 杂项——编码器控制小车走固定距离(stm32)

    2024-06-12 15:16:01       9 阅读
  11. 2833.距离原点最远的点

    2024-06-12 15:16:01       11 阅读
  12. 亚马逊云服务器价格贵不贵?

    2024-06-12 15:16:01       10 阅读