• 回溯算法求关于排列有关问题


    八皇后问题就是一个典型的全排列问题了,这个在有一篇博客已经写过了,但是今天想在这里对于排列问题来一个总结。

    排列问题主要涉及到以下几个方面:

    1.不带重复数的全排列

    2.带重复数的全排列

    3.有限个数的全排列(例如从n个数里面选择m个数,m<n)

    现在就以上几个方面把代码给大家,能理解则理解,不能理解就背下来,这种解法效率还是挺高的。

    代码前提:所有的数据我都默认从0到n-1,如果在实际运用中,有可能需要进行变化。

    1.不带重复数的全排列

    #include<iostream>
    using namespace std;
    int t=0;//代表最后我算出来的结果数
    int c[100];//例c[0]=2,在第0行中第一个元素在第2列(用下标莫见怪)
    bool isok(int row)
    {
        for(int x=0;x!=row;x++){//row代表所选的数不在同一行就可以;
            if(c[x]==c[row]){//如果他们在同一列就终止
                return false;
            }
        }
        return true;
    }
    void queen(int n,int row)
    {
        if(row==n){
            t++;
            for(int i=0;i<n;i++){
                cout << c[i] << ' ';
            }
            cout << endl;
            return ;
        }
        else{
            for(int x=0;x!=n;x++){
                c[row]=x;
                if(isok(row)){
                    queen(n,row+1);
                }
            }
        }
    }
    int main()
    {
        int n;
        cin >> n;
        queen(n,0);
        cout << t;
        return 0;
    }

    2.带重复数的全排列

    #include<iostream>
    using namespace std;
    int t=0;//代表最后我算出来的结果数
    int c[100];//例c[0]=2,在第0行中第一个元素在第2列(用下标莫见怪)
    void queen(int n,int row)
    {
        if(row==n){
            t++;
            for(int i=0;i<n;i++){
                cout << c[i] << ' ';
            }
            cout << endl;
            return ;
        }
        else{
            for(int x=0;x!=n;x++){
                c[row]=x;
                queen(n,row+1);
            }
        }
    }
    int main()
    {
        int n;
        cin >> n;
        queen(n,0);
        cout << t;
        return 0;
    }

    带重复数的全排列,也就是说,我不需要考虑这一列是否有元素已经放入了,我想放就放

    3.有限个数的全排列(例如从n个数里面选择m个数,m<n)

    #include<iostream>
    using namespace std;
    int t=0;
    int c[100];
    bool isok(int row)
    {
        for(int x=0;x!=row;x++){//row代表所选的数不在同一行就可以;
            if(c[x]==c[row]){//如果他们在同一列就终止
                return false;
            }
        }
        return true;
    }
    void queen(int n,int m,int row)
    {
        if(row==m){
            t++;
            for(int i=0;i<m;i++){
                cout << c[i] << ' ';
            }
            cout << endl;
            return ;
        }
        else{
            for(int x=0;x!=n;x++){
                c[row]=x;
                if(isok(row)){
                    queen(n,m,row+1);
                }
            }
        }
    }
    int main()
    {
        int n,m;//从n个数选择m个数
        cin >> n >> m;
        queen(n,m,0);
        cout << t;
        return 0;
    }
  • 相关阅读:
    LOJ#2245 魔法森林
    洛谷P1173 [NOI2016]网格
    [NOI2018]归程
    宇宙旅行
    hdu 4027 Can you answer these queries?(线段树)
    poj 1661 Help Jimmy(记忆化搜索)
    hdu 1078 FatMouse and Cheese(简单记忆化搜索)
    poj 3616 Milking Time (基础dp)
    hdu 1074 Doing Homework(状压dp)
    codeforces 735C. Tennis Championship(贪心)
  • 原文地址:https://www.cnblogs.com/sddr/p/10752213.html
Copyright © 2020-2023  润新知