首页 > 其他 > 详细

八皇后问题求解

时间:2015-11-26 19:05:42      阅读:161      评论:0      收藏:0      [点我收藏+]

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

它可以用递归来解决,但是递归的效率并不太高,也可以用数据结构来解决,因为只需要记录有还是没有,所以说用二维数组就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();
}

 

//未完待续,回头再写

八皇后问题求解

原文:http://www.cnblogs.com/leiyahui/p/4998495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!