#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn=10000+10;
int n,m,a[maxn],flag,flagx;
bool s[maxn];
void dfs(int step)
{
if(flagx==1)
return;
if(step>n)
{
flag++;
if(flag==m+1)//现在到了我们要加上的那个数的全排列的时候,我们就直接地输出,然后标记flagx,一直return,结束程序
{
for(int j=1;j<=n;j++)
printf("%d ",a[j]);
printf("\n");
flagx=1;
}
return;
}
for(int i=1;i<=n;i++)
{
if(flag==0)i=a[step];//当还在外星人给出的排列这个阶段的时候,我们就直指外星人给出的序列中的数
if(s[i]==0)
{
s[i]=1;
a[step]=i;
dfs(step+1);
s[i]=0;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(1);
return 0;
}
这是题解区一个题解, 看上去思路是恢复到了从头开始dfs一直到外星人数那一刻的现场. 主要是通过这句话:
if(flag==0)i=a[step];
, 看上去非常关键. 但是, 我不能理解为什么这样是对的. 为什么呢?