& D) s7 ?$ k9 z3 E, v3 n2 K % s) {4 |# }8 G e& A7 E/ D9 w* x' @/ j2 O
/*2 ?( i; F1 r" Y) [/ D, s2 }& g
使用递归方法求全排列. r9 ]2 i. M# }8 w1 ]* Q9 Z
*/! v' v9 G( z+ d e
' k [* |9 I9 M+ j* n#include<stdio.h>9 [8 p U- W3 D. a- k
1 W1 X+ B* k$ P- `/ {int sum=0;: V K, s) h; P% o1 Y% }
int main(){8 [! W. O: d8 D m1 E5 R
int n,i; - `$ H; u; J+ e, s- b, M- `+ K char *p;8 t3 M# d2 S X3 U/ {: s
void perm(char *,int,int);$ x5 B$ }6 n7 i8 Z
: m" [, A, R# B2 ]( k scanf("%d",&n);1 ^, X6 `' \8 n1 n* T* J
p=new char[n];4 u6 G9 b. Y! H0 E1 t
for(i=0;i<n;i++){ ; k- ^* C: d7 j% ^ d7 t getchar(); / D$ ~; y7 \+ F* ~' q scanf("%c",p+i);0 Q y! y, S7 ~+ n/ O) N8 A/ q0 r
}7 X. |5 y0 Q4 p' |- B
n& J7 H2 z- B/ E7 o0 h$ O. @ perm(p,0,n-1); $ }8 E$ ^6 |. ~% ^% T6 a' @ printf("==>%d",sum); , k8 o2 m9 m: `- z/ f. F/ D) D9 a
return 0; 0 r' V2 l# _ ?}2 @5 J9 T5 b- C& E, u
9 |" Z2 W* ^ G2 a4 k% B
void perm(char *p,int s,int e){1 P' W2 ]% ]- g! ~( m+ ` V
int i;$ f# H1 G! w8 n, O' m. c
void swap(char*,char*); 4 ^1 E6 |+ Y. D! N- |, E. n 1 G4 a# N, u4 Z8 @8 r
if(s==e){ - t( B% N; A( T9 ~( j4 b2 L2 c printf("%s\n",p); - s& G& x0 ^, I" L ] sum++;5 n& S, d2 `7 |) @) U
return ; & [4 [ y5 E$ h9 S6 L }2 k' D; u6 u! l1 S4 x3 V! k w
else{ & t! z' q5 D: [- H0 ]: x for(i=s;i<=e;i++){! } ?9 I) |% q* ?3 }% T
swap(p+s,p+i);( N w: d" z. q% B! x
perm(p,s+1,e); $ L2 f. T) x, u swap(p+s,p+i);8 z# g' ]; n! F
}4 M5 ^0 P3 Y* U% j: j H
}5 n* d7 N) x' y" o0 c8 f
} 8 ~' ^3 A5 u. | V- u" _2 n- p. [ K% Q$ U) C/ J; Z' r1 A- {
void swap(char *a,char *b){ ) n# ^. u& D& l0 o int tmp=*a;( }3 V4 y5 S- G$ R$ v, O* m
*a=*b; 2 d5 W, [& Y2 P- [# [ *b=tmp;+ N/ G4 h% @# ~# y
} 2 e* M8 ?6 U$ ?* q4 k* L, K: p' _5 _" b2 \
====================================================================== , Z$ [; O; r$ O' m5 V 1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。 ! F6 t& v5 e0 c- f W9 | 2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习! % Y) g5 U2 b1 h; Y2 u2 v' Y& V& b. r
; o: o; d* d2 G& o5 S# \* T# ]% u5 o0 i k+ g, p3 l8 e