夜深人静写算法 —— 排列问题(分治)

采用分治法,把一个字符串看成两部分:第一部分是它的第一个字符,第二部分是后面的所有字符。这样字符串的全排列就变成了第二部分的全排列,前提是要将第一个字符的情况全部列举出来。

(1)首先求所有可能出现在第一个位置的字符,也就是把第一个字符和后面的所有字符交换;

(2)然后在把后面的字符串看成新的字符串从(1),如果最后只剩下一个字符,就输出字符串,递归结束。


 #include <iostream>
 #include <stdio.h>
 #include <algorithm>
 #include <math.h >
 #include <string.h>
 using namespace std;
 inline void swap(char *a,char *b){
 	char c;
 	c = *a;
 	*a = *b;
	 *b = c; 
 } 
 template<class Type>
 void Perm(Type list[],int k,int m){  //数组的第k个到第m个的全排列
 	if(k == m){       //如果k等于m了,递归结束
 		for(int i = 0;i <= m ;i++)
 			cout<<list[i];
 		cout<<endl;
	 }else{
	 	for(int i = k; i <= m ;i++){
	 		swap(list[k],list[i]); //第k个和第i个交换,让第k个出现所有可能的情况
	 		Perm(list,k+1,m);
	 		swap(list[k],list[i]); //交换回去 ,保证每次递归结束,数组不变
		 }
	 }
 }
 int main(){
 	char ch[6] = "hallo";
 	int length = strlen(ch);
 	Perm(ch,0,length-1);
 	return 0;
 	
 }

猜你喜欢

转载自blog.csdn.net/curtern/article/details/83181547