题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1027
点击此处
题目描述
注意这里的第M个是指按照字典序大小算的
AC Code
用到了dfs的基本思路
因为是自己裸敲的,所以很乱。。。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<queue>
#include<string>
using namespace std;
int a[1005],n,m,cnt;
bool vis[1005],ok;//这两个都是标记变量,vis表示的是这个数字在全排列中有没有用过
void print(){ //输出函数
for(int i = 1;i <= n;i++){
if(i==1)printf("%d",a[1]);
else printf(" %d",a[i]);
}
cout << endl;
}
void dfs(int x){ //递归找全排列
if(!ok)return;
if(x > n) {
cnt++;
if(cnt==m&&ok){
print();
ok=0;//如果符合条件用标记变量记录一下
}
}
else {
for(int i = 1;i <= n;i++){
if(!vis[i]){
vis[i] = 1;
a[x]=i;
dfs(x+1);
vis[i]=0; // 这里需要重点思考
}
}
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
//各种初始化
memset(vis,0,sizeof vis);//初始化vis数组,全部初始化为0
ok=1;
cnt=0;
dfs(1);
}
return 0;
}
练习 : 超级楼梯
链接
https://vjudge.net/problem/27332/origin