本文主要是介绍(hdu)1027 全排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
调用STL库函数next_permutation(startAddress,endAddress)#include"stdio.h" #include"algorithm" using namespace std; int main() { int n,m,i; int a[20000]; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) a[i]=i+1; for(i=1;i<m;i++) next_permutation(a,a+n); for(i=0;i<n-1;i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); } return 0; }
求n个数全排列的第m个,,
深搜的顺序就是排列的顺序
8!=40320
给的m<=10000,所以只要排列八个数就可以了
#include<stdio.h> #include<string.h> int m,n,count,num[9],k,link[9]; void dfs(int u) { int i; if(count==m)return; if(u==9) { count++; if(count==m) { if(n<=8) { printf("%d",num[k+1]-k); for(i=k+2;i<=8;i++) printf(" %d",num[i]-k); printf("\n"); } else { printf("1"); for(i=2;i<=k;i++) printf(" %d",i); for(i=1;i<=8;i++) printf(" %d",num[i]+k); printf("\n"); } } } for(i=1;i<=8;i++) { if(link[i]==0) { link[i]=1; num[u]=i; dfs(u+1); link[i]=0; } } } int main() { int i,j; while(scanf("%d%d",&n,&m)!=-1) { memset(num,0,sizeof(num)); memset(link,0,sizeof(link)); count=0; if(n<8) k=8-n; else k=n-8; dfs(1); } return 0; }
这篇关于(hdu)1027 全排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!