//将问题分解为:每个数据都依次放在第一位置,问题变为,n-1个数据的排列问题,

//再将n-1中每个数据依次放在次位,问题变为,n-2个数据的排列问题,依次递归下去,直到p等于q,递归出口,数据的组合输出。

#include<cstdio> #include<iostream> #include<string> #include<algorithm> using namespace std; string str; //定义全局字符串str; void swap(int x, int y) {//交换字符串中x,y位置的字符; char temp = str[x]; str[x] = str[y]; str[y] = temp; } void func(int i, int j) {//递归函数 if (i == j) { //递归出口 for (int m = 0; m < str.size(); ++m) { cout << str[m]; } cout << endl; } else { for (int m = i; m < str.size(); ++m) { string s = str; //先把str保存起来 swap(i, m); sort(str.begin() + i+1, str.end()); //确定前面的字符后 把后面的字符串排序 比如abcd 当把ac交换后变成cbad,有了这一步会变成cabd。除了第一个a,后面的变得有序; func(i + 1, j);//下一层递归 str = s; //递归结束后把str复原 } } } int main() { int n; cin >> str; sort(str.begin(), str.end());//先统一排序 n = str.size(); func(0, n - 1); }