http://acm.hdu.edu.cn/showproblem.php?pid=1027
求数列n的第m个排列,STL中next_permutation的应用。相对应的还有prev_permutation。
View Code
#include <iostream> #include <map> #include <string> #include <algorithm> using namespace std; int main() { int n,m,i; int s[1100]; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) s[i]=i; while(--m) next_permutation(s+1,s+n+1); for(i=1;i<n;i++) printf("%d ",s[i]); printf("%d\n",s[n]); } return 0; }
不过这东西不常用,记不住简直坑爹,还是写个dfs省事儿
#include <iostream> using namespace std ; int n,m ; int vis[1001],ans[1001] ; int cnt,f ; void dfs(int cur) { if(f) return ; if(cur==n) { cnt++ ; if(cnt==m) { f=1 ; for(int i=0 ;i<n ;i++) { if(!i) printf("%d",ans[i]) ; else printf(" %d",ans[i]) ; } putchar('\n') ; } return ; } for(int i=1 ;i<=n ;i++) { if(!vis[i]) { vis[i]=1 ; ans[cur]=i ; dfs(cur+1) ; vis[i]=0 ; } } } int main() { while(~scanf("%d%d",&n,&m)) { cnt=f=0 ; memset(vis,0,sizeof(vis)) ; dfs(0) ; } return 0 ; }