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


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

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

    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;
    }
  • 相关阅读:
    2014 年最热门的国人开发开源软件TOP 100
    欢迎访问李培冠博客
    Go语言学习之路(持续更新)
    租房项目 获取地区信息服务
    租房项目 启动前的处理
    一步步带你用 FastDFS 搭建文件管理系统 详细的不得鸟
    golang 两个go程轮流打印一个切片
    golang 拷贝大切片一定比小切片代价大吗
    matlab 如何把数组A中与数组B中元素相同的元素删除
    golang 如何翻转含有中文 数字 英文字母等任意字符串
  • 原文地址:https://www.cnblogs.com/sddr/p/10752213.html
Copyright © 2020-2023  润新知