一维数组的全排列求解八皇后问题

一维数组的全排列求解八皇后问题:

一位数组的索引代表行index,数组元素值代表列index,

只需要校验在不在同一个对角线:是不是 abs(i - j) == abs(ColumnIndex[i] - ColumnIndex[j])

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

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

关于排列的详细讨论,详见本系列博客的第28篇,《字符串的排列》,这里不再赘述。

接下来就是写代码了。思路想清楚之后,编码并不是很难的事情。下面是一段参考代码:
*/
int g_number = 0;

bool Check(int ColumnIndex[], int length);
void Permutation(int ColumnIndex[], int length, int index);
void PrintQueen(int ColumnIndex[], int length);
void swap(int &a, int &b);

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)
        {
            //swap ColumnIndex[i] <=> ColumnIndex[index]
            swap(ColumnIndex[i],ColumnIndex[index]);
            //
            Permutation(ColumnIndex, length, index + 1);
            //swap ColumnIndex[i] <=> ColumnIndex[index]
            swap(ColumnIndex[i],ColumnIndex[index]);
        }
    }
}

bool Check(int ColumnIndex[], int length)
{
    for(int i = 0; i < length; ++ i)
    {
        for(int j = i + 1; j < length; ++ j)
        {
            if( abs(i - j) == abs(ColumnIndex[i] - ColumnIndex[j]) )
            {
                return false;
            }
        }

    }
    return true;
}

void PrintQueen(int ColumnIndex[], int length)
{
    printf("Solution %d\n", g_number);
    for(int i = 0; i < length; ++i)
    {
        //printf("%d\t", ColumnIndex[i]);
        int columnIndex=ColumnIndex[i];
        for (int j=0;j<8;j++)
        {
            if (j==columnIndex)
            {
                printf("1 ");
            } 
            else
            {
                printf("0 ");
            }
        }
        printf("\n");
    }
    printf("------------------------------\n");
}

void main()
{
    EightQueen();
}

void swap(int &a, int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
//
//Solution 92
//

 

posted @ 2018-02-05 14:48  sky20080101  阅读(99)  评论(0)    收藏  举报