字典序输出全排列

来源:互联网 发布:牛肉休闲食品销售数据 编辑:程序博客网 时间:2024/06/10 05:58
#include<stdio.h>int n,sum=0,list[5]={5,4,3,2,1};void swap(int a,int b){int temp=list[a];list[a]=list[b];list[b]=temp;}void move(int a,int b){int temp=list[b];for(int i=b;i<a;i++)list[i]=list[i+1];list[a]=temp;}void moveback(int a,int b){int temp=list[a];for(int i=a;i>b;i--)list[i]=list[i-1];list[b]=temp;}void dfs(int n,int pos){if(pos<1){sum++;for(int i=n-1;i>=0;i--)printf("%d ",list[i]);printf("\n");return;}for(int i=pos;i>=0;i--){swap(pos,i);if(i<pos-1)move(pos-1,i);dfs(n,pos-1);if(i<pos-1)moveback(pos-1,i);swap(pos,i);}}int main(){scanf("%d",&n);dfs(n,n-1);printf("%d\n",sum);return 0;}

非递归

#include<stdio.h>void swap(int *a,int *b){int temp=*a;*a=*b;*b=temp;}void reverse(int a,int b,int lis[]){int temp;for(int i=a;i<=(a+b)/2;i++){temp=lis[i];lis[i]=lis[b-i+a];lis[b-i+a]=temp;}}int main(){int n;while(~scanf("%d",&n)){int i,j,lis[6]={1,2,3,4,5,6};for(int i=0;i<n;i++)printf("%d",lis[i]);printf("\n");i=n-2;while(i>=0){if(lis[i]<lis[i+1]){for(j=n-1;j>i;j--)if(lis[j]>lis[i]){swap(&lis[i],&lis[j]);break;}reverse(i+1,n-1,lis);for(j=0;j<n;j++)printf("%d",lis[j]);printf("\n");i=n-1;}--i;}}return 0;}

使用STL的next_permutation函数生成全排列

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int main(){    char str[7];    while(scanf("%s",str)!=EOF){        int len=strlen(str);        printf("%s\n",str);        while(next_permutation(str,str+len))            printf("%s\n",str);        printf("\n");    }    return 0;}/**************************************************************    Problem: 1120    Language: C++    Result: Accepted    Time:340 ms    Memory:1520 kb****************************************************************/


0 0
原创粉丝点击