leiyahui

纸上得来终觉浅,绝知此事要躬行
八皇后问题求解

八皇后问题是编程人员需要解决的重要得问题

它可以用递归来解决,但是递归的效率并不太高,也可以用数据结构来解决,因为只需要记录有还是没有,所以说用二维数组就OK,数据结构不用太复杂。

另外可以这样想,既然结果只是记录有还是没有,所以说不用二维数组,把数组改为一维数组,只用记录是在哪一行,哪一列就OK。

如int a[8];

a[i]=3表示第i行的位置是在3

所以说这样用一维数组就可以表示出位置。

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define INTABLE  -1
void Init(int* a ,int n)        //初始化
{
    int i;
    for (i = 0; i < n; i++)
    {
        a[i] = INTABLE;
    }
}
int IsValid(int* a, int row, int col)        //判断第row行,第col列是否可以放皇后,行和列从0开始
{
    int i = 0;
    for (i = 0; i < row-1;i++)
    {
        if (a[i] == col || abs(i - row) == abs(a[i] - col))        //如果列冲突或者对角线冲突
        {
            return 0;
        }
    }
    return 1;
}
void print(int* a,int n)        //打印出正确的解
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d,%d\n", i, a[i]);
    }
}
void queue()        //队列
{
    int a[8];
    Init(a,8);
    int i = 0;
    int j = 0;
    int m = 1;
    while (i < 8)
    {
        while (j < 8)
        {
            if (IsValid(a, i, j))
            {
                a[i] = j;
                j = 0;
                break;
            }
            else
            {
                j++;
            }
        }
        if (a[i] == INTABLE)        //如果说这一行没有合适的位置
        {
            if (i == 0)        //回到第一行仍然没有合适的位置,则说明所有的已经遍历,退出该函数
            {
                break;
            }
            i--;
            j = a[i] + 1;
            a[i] = INTABLE;
            continue;
        }
        
        if (i == 7)        //说明已经遍历到最后一行,找到了一个合适的解,打印出来
        {
            printf("%d", m);
            print(a, 8);        //打印出正确的解
            j = a[i] + 1;
            a[i] = INTABLE;
            m++;
            continue;

        }
        i++;

    }
}
int main()
{
    queue();    //输出所有数组
    getchar();
}

 

//未完待续,回头再写

posted on 2015-11-26 17:54  雷大叔  阅读(309)  评论(0编辑  收藏  举报