一、不可重复排列:1~N
递归
题解一
#include<stdio.h>
#include<string.h>
void swap(char *a,char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
void Allarrange(char *str,int k,int len)
{
int i;
if(k==len)
{
static int s_i=1;
printf("第%d种排列为:\t%s\n",s_i++,str);
}
else
{
for(i=k;i<=len;i++)
{
swap(str+i,str+k);
Allarrange(str,k+1,len);
swap(str+i,str+k);
}
}
}
int main()
{
char str[10];
printf("请输入排列的字符串:");
gets(str);
Allarrange(str,0,strlen(str)-1);
return 0;
}
题解二
#include<bits/stdc++.h>
using namespace std;
int s[10000];
int n;
int used[1000];
void f(int a[],int x){
if(x>n){
for(int i=1;i<=n;i++)printf("%2d",s[i]);
cout<<endl;
return ;
}
else{
for(int i=1;i<=n;i++){
if(!used[i]){
used[i]=1;
s[x]=i;
f(a,x+1);
used[i]=0;
}
}
return ;
}
}
int main(){
cin>>n;
int a[10000];
for(int i=1;i<=n;i++)a[i]=i;
f(a,1); //数组,个数m;
return 0;
}
二、可重复排序:110
递归
去重复
#include<stdio.h>
#include<string.h>
int IsSame(char *str,int s_First,int s_End)
{
int i;
for(i = s_First ; i < s_End ; i++)
{
if(str[i]==str[s_End])
return 0;
}
return 1;
}
void swap(char *a,char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
void Allarrange(char *str,int k,int len)
{
int i;
if(k==len)
{
static int s_i=1;
printf("第%d种排列为:\t%s\n",s_i++,str);
}
else
{
for(i=k;i<=len;i++)
{
if(IsSame(str,k,i))
{
swap(str+i,str+k);
Allarrange(str,k+1,len);
swap(str+i,str+k);
}
}
}
}
int main()
{
char str[10];
printf("请输入排列的字符串:");
gets(str);
Allarrange(str,0,strlen(str)-1);
return 0;
}
三、next_permutation:寻找下一个排列
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[4];
strcpy(a,"0011");
do{
for(int i=0;i<4;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}while(next_permutation(a,a+4));
return 0;
}