1. 程式人生 > >遞歸--練習7--noi1750全排列

遞歸--練習7--noi1750全排列

時間 iostream 而且 sin content sort ble ret param

遞歸--練習7--noi1750全排列

一、心得

二、題目

1750:全排列

總時間限制:
1000ms
內存限制:
65536kB
描述

給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有‘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

三、AC代碼

 1 /*
 2 noi1750全排列
 3 //三個數組
 4 一個是原來存儲基本數據的
 5 一個是儲存答案的
 6 一個是做標記的 
 7 還有有個數來存答案的位數的 
 8 */ 
 9 #include <iostream>
10 #include <algorithm> 
11 using namespace
std; 12 int vis[10]; 13 char ans[10]; 14 void print(char ans[],int n){ 15 for(int i=0;i<n;i++){ 16 cout<<ans[i]; 17 } 18 cout<<endl; 19 } 20 void f(string s,int cur){ 21 int n=s.length(); 22 if(cur==n) print(ans,n); 23 else{ 24 for(int i=0;i<n;i++){
25 if(!vis[i]){ 26 vis[i]=1; 27 ans[cur]=s[i]; 28 f(s,cur+1); 29 vis[i]=0; 30 } 31 } 32 } 33 34 } 35 36 int main(){ 37 string s; 38 cin>>s; 39 sort(s.begin(),s.end()); 40 f(s,0); 41 return 0; 42 }

遞歸--練習7--noi1750全排列