洛谷P1088 火星人

//其实就是全排列  
//我们从外星人给的那串数字往下搜索 
//一直往下拓展m次 
//最后输出结果 
//虽然看起来很暴力,但是题目上说了m非常小 
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
int n,m;
#define maxn 10009
int a[maxn];
int b[maxn];
bool in[maxn]; 
int ks=0;
void dfs(int rest)
{
    if(rest==n+1)
    {
        ks++;
        if(ks==1+m)//这里+1是因为外星人自己给的那串数字搜索完了不能算 
        {
            for(int i=1;i<=n;i++)
            {
                printf("%d ",a[i]);
            }
            exit(0);
        }
            
    }
    for(int i=1;i<=n;i++)
    {
        if(ks==0)//一轮还没搜完,先按照外星人的顺序走 
        {
            i=a[rest];
        }
        if(in[i]==0)
        {
            in[i]=1;
            a[rest]=i;
            dfs(rest+1);
            in[i]=0;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    dfs(1);
    return 0;
}

 

上一篇:催收评分卡(五)--浅显理解模型一个非常重要的验证指标


下一篇:clojure/core get-in