回溯法.N皇后问题

问题及代码:

在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。 设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的放置方案。

#include <stdio.h>
#include <math.h>
#include <malloc.h>
void nQueens(int *x,int n);//求解n皇后问题
int place (int *x,int k);//判断是否可以在第k行第x[k]列摆放皇后
void printSolution(int *x,int n);//输出求解结果
int main()
{
    int n;
    int *x;//存放求解结果的数组首地址
    scanf("%d",&n);
    x=(int*)malloc(sizeof(int)*(n+1));//动态分配数组空间,x[0]空闲
    nQueens(x,n);
    return 0;
}
int place(int *x,int k)
{
    int i;
    for(i=1; i<k; i++)//对前k-1行,逐行考察
    {
        if((x[i]==x[k])||(fabs(x[i]-x[k])==fabs(i-k)))//在同一列或在同一斜线上
            return 0;
    }
    return 1;
}
void nQueens(int *x,int n)
{
    int k;
    k=1;
    x[k]=0;//进入循环后即执行了x[k]++,变为了第一列;
    while(k>0)
    {
        x[k]++;
        while(x[k]<=n&&!place(x,k))//每一列均进行判断
            x[k]++;//下一列
        if(x[k]<=n)//找到了一个位置可以摆放皇后
        {
            if(k==n)
                printSolution(x,n);//输出
            else
            {
                k++;//移到下一行
                x[k]=0;//从第一列开始考虑
            }
        }
        else
            k--;
    }
}
void printSolution(int *x,int n)
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            if(j==x[i])
                printf("Q");
            else
                printf("*");
        }
        printf("\n");
    }
    printf("\n");
}

运行结果

《回溯法.N皇后问题》

    原文作者:回溯法
    原文地址: https://blog.csdn.net/JYL1159131237/article/details/70460210
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞