• (递归)1750:全排列


    描述 
    给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’a’ < ‘b’ < … < ‘y’ < ‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

    输入 
    输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

    输出 
    输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义: 
    已知S = s1s2…sk , T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得 
    s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。

    样例输入 
    abc

    样例输出 
    abc 
    acb 
    bac 
    bca 
    cab 
    cba

    我の思考: 
    用递归的方法,来把这个问题划分为一个个小的部分。假设我们有n个字母,那么就可以划分为分别以n开头的情况。比如输入abc,那就有以a开头的、b开头和c开头这三种情况。再细化把剩下的字母又这样进行遍历。

    我の代码

    #include<iostream>
    #include<string.h>   //要使用strlen这个函数
    using namespace std;
    const int M = 8;    //用常量定义来确定长度
    char str[M];        //输入的字符串
    char p[M];          //符合条件的字符串
    bool used[M]={0};   //标记字母是否已被使用
    int len=0;          //字符串长度
    
    void permutation(int i)
    {
        if(i==len)   //如果遍历结束,输出p
        {
            cout<<p<<endl;
            return;
        }
        else
        {
            //遍历每一个字母开头的情况
           for(int k=0;k<len;k++){  
                if(!used[k]){   
                    used[k]=true;
                    p[i]=str[k];    //赋值没有使用过的字母
                    permutation(i+1);    //继续赋值下一个
                    used[k]=false;  //用于递归回来的时候一个个取消标记
                 }
           }
        }
    }
    int main(void)
    {
        cin>>str;
        len=strlen(str);
        permutation(0);
        return 0;
    }
  • 相关阅读:
    聊聊ES6中的generator
    generator-yield到底是个啥
    jquery 常用方法中那些我不知道的事
    jquery 获取textarea文本值详解
    数组去重
    五指棋人机大战之ai篇
    五指棋人机大战之ui篇
    css控制背景图像不随滚动条的滚动而滚动
    用canvas画会旋转的伞
    CSS3 实现太极图案
  • 原文地址:https://www.cnblogs.com/rimochiko/p/7486926.html
Copyright © 2020-2023  润新知