法一:next_permutation函数,两个参数分别为起始指针和末尾指针。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 char arr[19]; 5 int main(){ 6 scanf("%s",arr); 7 int len=strlen(arr); 8 sort(arr,arr+len); 9 char *s=arr,*t=arr+len; 10 do{ 11 printf("%s ",arr); 12 }while(next_permutation(s,t)); 13 }
法二:dfs
注意全排列一共有$n!$种,所以num数组一定要开的够大。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 char arr[100]; 5 char brr[100]; 6 string num[720000]; 7 bool v[100]; 8 int n; 9 int k=0; 10 void dfs(int t){ 11 if(t>=n){ 12 num[k++]=brr; 13 return; 14 } 15 16 for(int i=0;i<n;i++){//dfs必须多加熟悉 17 if(!v[i]){ 18 v[i]=true; 19 brr[t]=arr[i]; 20 dfs(t+1); 21 v[i]=false; 22 } 23 } 24 } 25 int main(){ 26 scanf("%s",arr); 27 n=strlen(arr); 28 //sort(arr,arr+n); 29 //这里不必排,因为最后肯定要排 30 dfs(0); 31 sort(num,num+k); //这里必须排序 32 int m=unique(num,num+k)-num; 33 for(int i=0;i<m;i++){ 34 cout<<num[i]<<endl; 35 } 36 }