递归方式

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;
string seq;


const int MAXN = 10;
bool visit[MAXN];

void digui(const string &s, int index){//index指当前递归深度,从0开始 
	if(index == s.size()){//递归出口
		printf("%s\n",seq.c_str());
		seq.erase(seq.end()-1);
		return;
	}
	for(int i=0; i<s.size(); i++){
		if(!visit[i]){
			visit[i] = true;
			seq.push_back(s[i]);
			digui(s, index+1);
			visit[i] = false;
		}
	}
	//把后面的扫完了也得回退
	if(seq.size()){
		seq.erase(seq.end()-1);
		return;
	}
}

int main(){
	string s;
	while(cin >> s){
		sort(s.begin(),s.end());
		memset(visit, false, sizeof(visit));
		digui(s, 0);
		s.clear();
		seq.clear();
	}
	return 0;
}