• 数组全排列的递归方法实现


    问题出自linux C 一站式编程网站,定义一个数组,编程打印它的全排列

    程序的主要思路是:

    1. 把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。

    2. 把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。

    3. 把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。

    可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。

        解题过程:

       (1) 当 N = 1的时候,则直接打印数列即可。

       (2) 当 N = 2的时候,设数组为 [a, b]

                打印a[0], a[1] (即a,b)

                交换a[0],a[1]里面的内容

                打印a[0],a[1]   (此时已变成了 [b, a] )

        (3) 当 N = 3的时候,数组为 [a, b, c]

      •  把a放在 a[0] 的位置(原本也是如此,a[0] = a[0]),打印b,c的全排列(即a[1], a[2]的全排列)

                           a  b  c

                           a  c  b

      •  把b放在a[0]的位置(这时候需要交换原数组的a[0]和a[1]),然后打印a, c的全排列

                           b   a  c

                           b   c  a                       

                      打印完后再换回原来的位置,即a还是恢复到a[0],b还恢复到a[1]的位置

      •  把c放在a[0]的位置(这时候需要交换的是原数组的a[0]和a[2]),然后打印a, b的全排列
                 c  b  a
                 c  a  b
                打印完后再换回原来的位置,即a还是恢复到a[0],b还恢复到a[1]的位置 至此,全排列完成
    当 N = 4,5,6,……的时候,以此类推。
    View Code
     1 #include <stdio.h>
     2 #define N 4
     3 int a[N];
     4 void perm(int);
     5 void print();
     6 void move(int, int);
     7 int main(){
     8     int i;
     9     for(i = 0; i<N; i++){
    10         scanf("%d",&a[i]);
    11     }
    12     perm(0);
    13 }
    14 
    15 void perm(int offset){
    16     int i;
    17     if(offset == N-1){
    18         print();
    19         return;
    20     }else{
    21         for(i = offset;i < N; i++){
    22             move(i, offset);
    23             perm(offset + 1);
    24             move(i, offset);
    25         }
    26     }
    27 }
    28 void print(){
    29     int i;
    30     for(i = 0; i < N-1; i++)
    31         printf("%d ",a[i]);
    32     printf("\n");
    33 }
    34 void move(int i, int offset){
    35     int temp;
    36     temp = a[offset];
    37     a[offset] = a[i];
    38     a[i] = temp;
    39 }
    
    
    
     
  • 相关阅读:
    Pandas也能轻松绘图,简单而又漂亮
    笔试题: 二叉排序数左移k个
    补题next_permutation
    从HTTP到HTTPS
    HTTP首部字段详解
    HTTP请求方法及响应状态码详解
    HTTP报文格式详解
    TCP/IP网络基础
    Netty学习笔记
    ZooKeeper学习笔记
  • 原文地址:https://www.cnblogs.com/timeship/p/2742663.html
Copyright © 2020-2023  润新知