zoukankan      html  css  js  c++  java
  • 递归--任意字符全排列(第二次写)

      以前是参考书上的来写的。现在自己再动手来写一遍,这样才能真正的把它吸收。

      求N个字符的全排列问题其实很简单,比如ABCD,我们可以用递归的方法,每一层递归负责管理一个字符位置选什么。比如说第一层确定第一个位置的字符:用for循环来不断的用后面的字符与第一位的交换,就可以得到不同的情况,而对于任何一种情况,又可以递归的下去。每一层都有个循环来控制对应位以及之后支付的交换即可。可能写得比较抽象,可以参考别人写的说明,因为我这是第二次写了。是用自己的理解去写的。如果再加上去除重复的话,那么就要添加一个函数,判断要交换的字符是不是和之前交换过的字符重复,重复的话就交换下一个。

    代码:

    //字符串ACB
    //先确定第0位,若为A:ABC ACB
    //               若为B:BAC BCA
    //到下一层递归的时候,再确定第1位
    
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void swap(char *str,int a, int b)
    {
        char tmp = str[a];
        str[a] = str[b];
        str[b] = tmp;
    }
    
    int repeat(char *str,int cnt,int a)
    {
        //返回零表示存在相等,不用交换
        //返回1表示不存在相等,交换
        int i;
    
        for (i = cnt; i < a; i++)
        {
            if (str[i] == str[a])
            {
                return 0;
            }
        }
        return 1;    
    
    }
    
    void permutaion(char *str,int n,int cnt)    
    {
        //cnt是用来确定第cnt位置的位置该与
        //它后面的字符串逐个的变换位置
    
        int i,k;
        if (cnt == n - 1)    //函数出口
        {
            printf("%s
    ",str);
            return;
        }
        else
        {
            for (i = cnt; i < n; i++)    //第cnt位置以及之前的位置都确定了,那么就依次把i的位置与第cnt的位置
            {
                if (repeat(str,cnt,i))    //若跟前面的相等,则不交换
                {
                    swap(str,cnt,i);
                    permutaion(str,n,cnt+1);
                    swap(str,cnt,i);        //把位置换回来
                }
            }
        }
    }
    
    int main()
    {
        char *str;
        int n;
    
        scanf("%d",&n);
        str = (char *)malloc((n+1)*sizeof(char));
    
        scanf("%s",str);
        printf("The full permutaion is : 
    ");
        permutaion(str,n,0);
    
        return 0;
    }
    
    2013/9/5    22:59
  • 相关阅读:
    云时代架构阅读笔记时十
    云时代架构”经典文章阅读感想九
    “云时代架构”经典文章阅读感想八
    antlr4
    Centos7定时脚本
    JDBC连接hive失败,一种原因的解决方法
    Linux实用操作命令
    secureCRT下载虚拟机文件到本地
    OpenFeign执行POST请求类型以及Python的requests.post()方法
    DataSphere安装配置
  • 原文地址:https://www.cnblogs.com/Jason-Damon/p/3304552.html
Copyright © 2011-2022 走看看