zoukankan      html  css  js  c++  java
  • 【算法】字符串全排列扩展-八皇后问题

    原文:http://zhedahht.blog.163.com/blog/static/2541117420114331616329/

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。

    这就是有名的八皇后问题。解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。

    由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把ColumnIndex的八个数字分别用0-7初始化,接下来我们要做的事情就是对数组ColumnIndex做全排列。由于我们是用不同的数字初始化数组中的数字,因此任意两个皇后肯定不同列。我们只需要判断得到的每一个排列对应的八个皇后是不是在同一对角斜线上,也就是数组的两个下标ij,是不是i-j==ColumnIndex[i]-Column[j]或者j-i==ColumnIndex[i]-ColumnIndex[j]

    int g_number = 0;
    
     
    
    void EightQueen()
    
    {
    
        const int queens = 8;
    
        int ColumnIndex[queens];
    
        for(int i = 0; i < queens; ++ i)
    
            ColumnIndex[i] = i;
    
     
    
        Permutation(ColumnIndex, queens, 0);
    
    }
    
     
    
    void Permutation(int ColumnIndex[], int length, int index)
    
    {
    
        if(index == length)
    
        {
    
            if(Check(ColumnIndex, length))
    
            {
    
                ++ g_number;
    
                PrintQueen(ColumnIndex, length);
    
            }
    
        }
    
        else
    
        {
    
            for(int i = index; i < length; ++ i)
    
            {
    
                int temp = ColumnIndex[i];
    
                ColumnIndex[i] = ColumnIndex[index];
    
                ColumnIndex[index] = temp;
    
     
    
                Permutation(ColumnIndex, length, index + 1);
    
     
    
                temp = ColumnIndex[index];
    
                ColumnIndex[index] = ColumnIndex[i];
    
                ColumnIndex[i] = temp;
    
            }
    
        }
    
    }
    
     
    
    bool Check(int ColumnIndex[], int length)
    
    {
    
        for(int i = 0; i < length; ++ i)
    
        {
    
            for(int j = i + 1; j < length; ++ j)
    
            {
    
                if((i - j == ColumnIndex[i] - ColumnIndex[j])
    
                    || (j - i == ColumnIndex[i] - ColumnIndex[j]))
    
                return false;
    
            }
    
        }
    
     
    
        return true;
    
    }
    
     
    
    void PrintQueen(int ColumnIndex[], int length)
    
    {
    
        printf("Solution %d
    ", g_number);
    
     
    
        for(int i = 0; i < length; ++i)
    
            printf("%d	", ColumnIndex[i]);
    
        
    
        printf("
    ");
    
    }
  • 相关阅读:
    JAVA中的super和this关键字的使用
    JAVA中类以及成员变量和成员方法的修饰符的总结
    JAVA中的抽象类和接口
    JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作
    完整日期正则表达式
    2017实习【Java研发】面经
    MySQL事务及隔离级别(读书小结)
    Java类编译、加载、和执行机制
    JVM内存回收机制
    Centos6.5的MySQL5.7.15二进制源码单机版安装
  • 原文地址:https://www.cnblogs.com/theCambrian/p/3475164.html
Copyright © 2011-2022 走看看