zoukankan      html  css  js  c++  java
  • (递归)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;
    }
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/rimochiko/p/7486926.html
Copyright © 2011-2022 走看看