hdu 1027(全排列)
1 #include<iostream> 2 #include<algorithm> //next_permutation的函数声明 3 #include<stack> 4 #include<queue> 5 using namespace std; 6 int main() 7 { 8 int i,j,k,n,m; 9 int a[1111]; 10 while(~scanf("%d %d",&n,&m)) 11 { 12 for(i = 0;i <n;i ++) 13 { 14 a[i] = i+1; 15 } 16 for(i = 2;i <=m;i ++) 17 { 18 next_permutation(a,a+n); 19 } 20 for(i = 0;i<n-1;i ++) 21 { 22 printf("%d ",a[i]); 23 } 24 printf("%d\n",a[i]); 25 } 26 return 0; 27 }
//hdu 1027
//全排列,输出第M小的数
1 #include<iostream> 2 #include<algorithm> 3 #include<stack> 4 #include<queue> 5 #include<list> 6 #include<vector> 7 using namespace std; 8 9 int main() 10 { 11 int i,j,k,n,m,q; 12 int a[1111]; 13 while(~scanf("%d %d",&n,&m)) 14 { 15 a[0] = 0; 16 for(i = 1;i <=n;i ++) 17 { 18 a[i] = i; 19 } 20 for(i = 2;i <= m;i ++) 21 { 22 j = n; 23 while(a[j] < a[j -1]) // 找出可交换的位置 24 { 25 j --; 26 } 27 if(j == 1) 28 { 29 for(k = 1;k <=n;k ++) 30 { 31 a[k] = k; 32 } 33 } 34 else 35 { 36 for(k = n;k >= j;k --) // 从后面找到第一个比a[j -1]的数,进行交换。 37 { 38 if(a[k] >a[j - 1]) 39 { 40 int t =a[k]; 41 a[k] = a[j -1]; 42 a[j - 1] = t; 43 break; 44 } 45 } 46 sort(a+j,a+1+n);//将后几位排序 47 } 48 } 49 for(i = 1;i < n;i ++) 50 { 51 printf("%d ",a[i]); 52 } 53 printf("%d\n",a[n]); 54 } 55 return 0; 56 }