zoukankan      html  css  js  c++  java
  • 回溯算法求关于排列有关问题

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

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

    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;
    }
  • 相关阅读:
    HDOJ2003求绝对值
    HDOJ2002计算球体积
    jsp input 限制只可输入时分秒 My97DatePicker
    BigDecimal格式化
    官方 Animator 例子解析 Animator.MatchTarget
    LoadAssetAtPath 与 Load 的区别
    SQLite 学习流水账笔记
    Unity3D Development模式下的一个小问题
    Sqlitekit 封装管理
    PhotoshopCS4轻松将PSD分层导出为Png分层
  • 原文地址:https://www.cnblogs.com/sddr/p/10752213.html
Copyright © 2011-2022 走看看