1199:全排列

1199:全排列
時間限制: 1000 ms         內存限制: 65536 KB
【題目描述】
給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。
我們假設對於小寫字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且給定的字符串中的字母已經按照從小到大的順序排列。
【輸入】
只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
【輸出】
輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:
已知S=s1s2...sk,T=t1t2...tk,則S<T等價於,存在p(1≤p≤k),使得s1=t1,s2=t2,...,s(p−1)=t(p−1),sp<tp成立。
【輸入樣例】
abc
【輸出樣例】
abc
acb
bac
bca
cab
cba
【提示】
本題目禁止使用STL及包含可以使用的相關調用。
【來源】
No

#include<stdio.h>
#include<iostream> 
#include<cstring>
using namespace std;
bool b[1001];//標記 
char s[1001],as[1001]; //s存儲原字符串 as存儲排序方案 
int len;
void dfs(int i)
{
	for(int j=0;j<len;j++){
		if(!b[s[j]]){//判斷是否用過 
			b[s[j]]=1;
			as[i]=s[j];
			if(i==len-1) printf("%s\n",as);//長度達到輸出 
			else dfs(i+1);//否則取下一個長度 
			b[s[j]]=0;//標記取消 
		}
	}
}
int main()
{
	scanf("%s",s);
	len=strlen(s);
	dfs(0);//從長度0開始搜索 
	return 0;
 } 
#include<stdio.h>
#include<iostream> 
#include<cstring>
using namespace std;
char a[1001];
int b[1001],c[1001]={0};
int len;
void dfs(int n)
{
	if(n==len){
		for(int i=0;i<len;i++) cout<<a[b[i]];
		cout<<endl;
	}
	for(int i=0;i<len;i++){
		if(!c[i]){//判斷是否用過 
			c[i]=1;
			b[n]=i;
			dfs(n+1);//取下一個長度 
			c[i]=0;//標記取消 
		}
	}
}
int main()
{
	scanf("%s",a);
	len=strlen(a);
	dfs(0);//從長度0開始搜索 
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章