/*此题是博主做过的最简单的dfs,但不得不说很经典的dfs的思路,简单的思路是在给定的一序列中找到第m个最小序列,转换一下思路,若将初始序列作为一个排列,那么每次都是在向下找一个排列的问题,最终找到第m个排列为止*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;//n需要全排列的总数,m需要选出的第m个全排列
int a[1000+10], vis[1000+10];
int flag, sum;//flag为自定义的一个终止变量,sum为计数器输出低m个全排列
void dfs(int k)//dfs中主要处理的部分为当k==n+1时即将所有排列遍历完毕计数+1,判断计数是否和题目要求的匹配即可
{
if(flag == 1) return ;//小剪枝
if(k == n+1){//传值总是k+1所以最终是n+1
sum++;//计算当前是第几个全排列
if(sum == m){
flag = 1;//终止变量赋值结束
for(int i = 1; i < n; i++){
printf("%d ", a[i]);
}
printf("%d\n", a[n]);
return;
}
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
vis[i] = 1;
a[k] = i;
dfs(k+1);//扫描下一个值
vis[i] = 0;
}
}
}
int main()
{
while(scanf("%d%d", &n,&m) != EOF){
memset(vis, 0, sizeof(vis));
sum = flag = 0;
dfs(1);
}
return 0;
}
hdu1027Ignatius and the Princess II
最新推荐文章于 2019-03-04 16:29:42 发布