可以问题解(有句看不懂)? 如何恢复回溯现场?
查看原帖
可以问题解(有句看不懂)? 如何恢复回溯现场?
251011
Tokubara楼主2020/9/26 17:27
#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];, 看上去非常关键. 但是, 我不能理解为什么这样是对的. 为什么呢?

2020/9/26 17:27
加载中...