• 全排列算法递归及STL实现,八皇后问题


    一种网上流传的递归型全排列算法,原创不详。只不知如果数组中有重复的元素的话何解?

    #include <iostream>
    
    void permutation(char* list, int begin, int end) {
        if(begin < end) {
            for(int i = begin; i <= end; ++i) {
                std::swap(list[i], list[begin]);
                permutation(list, begin + 1, end);
                std::swap(list[i], list[begin]);
            }
        }
        else {
            for(int i = 0; i <= end; ++i){
                std::cout << list[i];
            }
            std::cout << std::endl;
        }
    }
    
    int main() {
        char a[] = "1234";
        std::cout << a << "的全排列结果如下:" << std::endl;
        permutation(a, 0, (int)strlen(a) - 1);
        return 0;
    }

    http://blog.csdn.net/hackbuteer1/article/details/6657435看到STL的思路实现的全排列

    STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。

    #include <iostream>
    #include <algorithm>
    
    void permutation(char* list, int length) {
        std::sort(list, list + length);
        do {
            for(int i = 0; i < length; ++i) {
                std::cout << list[i];
            }
            std::cout << std::endl;
        }while(std::next_permutation(list, list + length));
    }
    
    int main() {
        char a[] = "1234";
        std::cout << a << "的全排列结果如下:" << std::endl;
        permutation(a, (int)strlen(a));
        return 0;
    }

    由全排列算法联想到一个经典问题:八皇后问题

    /* ----- eight queen ----- */
    
    #include <iostream>
    #include <algorithm>
    
    int g_number = 0;
    
    void printQueen(int list[], int length) {
        printf("queenList[%d]:\t", g_number);
        for (int i = 0; i < length; ++i) {
            printf("%d ", list[i]);
        }
        printf("\r\n");
    }
    
    bool check(int list[], int length) {
        for (int i = 0; i < length; ++i) {
            for (int j = i + 1; j < length; ++j) {
                if ( (i - j == list[i] - list[j]) || (i - j == list[j] - list[i]) ) {
                    return false;
                }
            }
        }
        return true;
    }
    
    void permutation(int ColumnIndex[], int index, int length) {
        if (index == length) {
            if(check(ColumnIndex, length)) {
                ++g_number;
                printQueen(ColumnIndex, length);
            }
        }
        else {
            for(int i = index; i < length; ++ i) {
                std::swap(ColumnIndex[i], ColumnIndex[index]);
                permutation(ColumnIndex, index + 1, length);
                std::swap(ColumnIndex[i], ColumnIndex[index]);
            }
        }
    }
    
    void eightQueen() {
        const int queenCount = 8;
        int queenList[queenCount];
        for (int i = 0; i < queenCount; ++i) {
            queenList[i] = i;
        }
        permutation(queenList, 0, queenCount);
    }
    
    int main(int argc, char const *argv[]) {
        eightQueen();
        return 0;
    }
  • 相关阅读:
    查询不同类别中最大的一条
    thinkphp模版调用函数方法
    mysql中explain的用法
    简易PHP多文件上传源码
    JS实现:鼠标悬停图片,图片由彩色变为灰色
    PHP分页基础教程之简单分页原理
    MYSQL建立索引需要注意以下几点!!!
    php_扑克类
    详细介绍Linux shell脚本基础学习(一)
    详细介绍Linux shell脚本基础学习(二)
  • 原文地址:https://www.cnblogs.com/pure/p/2931565.html
Copyright © 2020-2023  润新知