• P1088 火星人


    题意:从全排列的某一个排列开始向后继续搜索m个,输出这个排列后面的第m个排列
    思路:先根据开始的状态,先模拟去搜索一遍,然后通过递归回溯,接着去搜下面的状态。

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    const int N = 10010;
    
    int n, m;
    int a[N], b[N];
    int st[N];
    
    void dfs(int u){
        if(m < 0) return;
        if(u == n + 1){
            m --;
            if(m == 0) for(int i = 1; i <= n; i ++) cout << b[i] << ' ';
            return;
        }
        
        for(int i = (a[u] ? a[u] : 1); i <= n; i ++)
            if(st[i] == 0){
                if(i == a[u]) a[u] = 0;
                st[i] = 1;
                b[u] = i;
                dfs(u + 1);
                st[i] = 0;
            }
    }
    
    int main(){
        cin >> n >> m;
        
        m ++;
        
        for(int i = 1; i <= n; i ++) cin >> a[i];
        
        dfs(1);
    }
    
  • 相关阅读:
    9.17考试
    Something
    tesuto-Mobius
    7.22考试
    填坑...P1546 最短网络 Agri-Net
    P1125 笨小猴
    P2822 组合数问题
    致我们曾经刷过的水题
    Luogu P1186 玛丽卡
    Luogu P1726 上白泽慧音
  • 原文地址:https://www.cnblogs.com/tomori/p/13776677.html
Copyright © 2020-2023  润新知