多维数组------八皇后问题

来源:互联网 发布:上知教育一个月多少钱 编辑:程序博客网 时间:2024/05/16 19:15
/*
八皇后问题
在8*8的棋盘上摆放8个皇后,不能处于一排一列或者一斜线上,,使其不能相互攻击
*/

#include <stdio.h>
#include <math.h>        //使用绝对值函数asb

const int N = 100;        //最多求100皇后问题
int x[N] = {-1};            //数组初始化为-1

int Place(int k);
void PrintQueue(int n);

void Queue(int n)
{
    int k = 0,num = 0;
    while(k>=0)        //摆放皇后k,
    {
        x[k]++;            //在下一列摆放皇后k
        while(x[k] < n && Place(k) == 1)        //发生冲突
            x[k]++;                //皇后k试探下一列
        if(x[k] < n && k==n-1)
        {
            printf("第%d个解是:",++num);
            PrintQueue(n);
        }else if(x[k] <n && k<n-1)        //尚有皇后未摆放
            k = k+1;        //准备摆放下一个皇后
        else
            x[k--] = -1;        //重置x[k],回溯,重新摆放皇后k
    }
}

int Place(int k)            //观察皇后k放置在x[k]列是否发生冲突
{
    for(int i=0;i<k;i++)
        if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
            return 1;
        return 0;
}

void PrintQueue(int n)
{
    for(int i=0;i<n;i++)
        printf("%5d",x[i]+1);            //数组下标从0开始,打印的列号从1开始
    printf("\n");
}

int main()
{
    int n;
    printf("请输入皇后个数(n>=4)");
    scanf("%d",&n);
    Queue(n);
    return 0;

}



原创粉丝点击