(递归)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;
}
原文地址:https://www.cnblogs.com/rimochiko/p/7486926.html