P1088 [NOIP2004 普及组] 火星人

大意是给出1-10000的一个全排列,然后给出整数m,求这个全排列的后m个全排列。从这个排列开始深搜即可。

#include
#include
#include
#include
#include

using namespace std;

const int N = 1e4+10;
const int M = 1e6;
int a[N];
int b[N];
bool yep =  false;
int cnt;
int n,m;
int st[N];
int flag = 0;

void dfs(int u)
{
    if(yep == true) return;
    
    if(u > n)
    {
        flag = 1;
        
        cnt++;
        
        if(cnt == m+1)
        {
            for(int i = 1 ; i<= n ; i++) printf("%d ",a[i]);
        
            yep = true;
        }
            return;
    }
    
    for(int i = 1 ; i<= n ; i++)
    {
        if(flag == 0) i = b[u];
        if(!st[i])
        {
            a[u] = i;
            st[i] = 1;
            dfs(u+1);
            st[i] = 0;
        }
    }
    
    
}


int main()
{
    cin>>n>>m;
    
    for(int i = 1 ; i<= n ; i++) scanf("%d",&b[i]);
   
    dfs(1);
    
    return 0;
    
}

你可能感兴趣的:(深度优先,算法,图论)