当前位置 博文首页 > SYP___:夜深人静写算法 —— 排列问题(分治)

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

    作者:[db:作者] 时间:2021-09-03 21:42

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

    (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;
     	
     }
    
    

    ?

    cs