// https://www.luogu.com.cn/problem/P1088
#include<iostream>
using namespace std;
const int N=1e4+5;
int mars[N]; // 记录初始手指排列
int a[N]; // 记录手指排列(答案)
int flag[N]; // 标志数组
int have_answer,n,m,cnt;
void dfs(int k){
if(have_answer) //找到答案后终止(剪枝)
return;
if(k==n+1){
cnt++;
if(cnt==m+1){ // 找到答案
have_answer=1; // 标记
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return; // 这里不要忘记return
}
}
for(int i=1;i<=n;i++){
if(cnt==0) // 将dfs初始状态设为原始手指排列
i=mars[k];
if(flag[i]==0){
flag[i]=1;
a[k]=i;
dfs(k+1);
flag[i]=0; // 恢复现场
a[k]=0; // 此句不加也可(后面会自动覆盖)
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>mars[i];
dfs(1); // dfs
return 0;
}
DFS习题-洛谷P1088火星人(NOIP2004普及组)
最新推荐文章于 2024-06-15 23:36:03 发布