标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1027
最近学校断网了,VJ上不去,跑出来上网。
不想写难题,写点简单的不让自己手生。
求n个数的第m个全排列,这题怎么过都可以,不过暴力dfs的时候需要注意一点就是要加一个flag判断是否已经输出当前符合情况的全排列。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 14 using namespace std; 15 16 const int maxn = 1010; 17 int n, m, flag; 18 int vis[maxn]; 19 int arr[maxn]; 20 21 void solve(int k) { 22 if(flag) { 23 return ; 24 } 25 if(k == n) { 26 m--; 27 if(!m) { 28 for(int i = 0; i < n; i++) { 29 printf("%d", arr[i]); 30 putchar(i < n - 1 ? ‘ ‘ : ‘\n‘); 31 flag = 1; 32 } 33 } 34 } 35 for(int i = 1; i <= n; i++) { 36 if(!vis[i]) { 37 vis[i] = 1; 38 arr[k] = i; 39 solve(k+1); 40 vis[i] = 0; 41 } 42 } 43 } 44 45 int main() { 46 // freopen("in", "r", stdin); 47 while(~scanf("%d %d", &n, &m)) { 48 memset(vis, 0, sizeof(vis)); 49 flag = 0; 50 solve(0); 51 } 52 }
STL解法:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 14 using namespace std; 15 16 int n, m; 17 int arr[1010]; 18 19 int main() { 20 // freopen("in.txt","r",stdin); 21 while(~scanf("%d %d", &n, &m)) { 22 for(int i = 1; i <= n; i++) { 23 arr[i] = i; 24 } 25 while(--m) { 26 next_permutation(arr+1, arr+n+1); 27 } 28 for(int i = 1; i <= n; i++) { 29 printf("%d", arr[i]); 30 putchar(i < n ? ‘ ‘ : ‘\n‘); 31 } 32 } 33 }
[HDOJ1027]Ignatius and the Princess II
标签:
原文地址:http://www.cnblogs.com/vincentX/p/4779366.html