2018-11-03

2018-11-03  本文已影响0人  海上生明月_c2c3
#include<stdio.h>
#define Debug
int count=0;
void Queen(int n,int l);
bool CanPut(int i,int j,int (*a)[8],int n);
void Print(int (*a)[8],int n);
int main()
{
    printf("请输入棋盘的规模\n");
    int n;
    scanf("%d",&n);
    Queen(n,0);
    if(count)
        printf("解的总数是:%d\n",count);
    else
        printf("无解\n");
    return 1;
}
int a[8][8]={0};
void Queen(int n,int l)
{
    if(l==n-1)//最后一行,递归出口
    {
        for(int j=0;j<n;j++)
        {
            if(CanPut(l,j,a,n))//是否能放置皇后
            {
                count++;
                a[l][j]=1;//标记位置
                Print(a,n);
                a[l][j]=0;//取消这个位置
            }
        }
        printf("\n");
    }
    else//不是最后一行
    {
        for(int j=0;j<n;j++)
        {
            a[l][j]=1;//假设这个位置可以放
            if(CanPut(l,j,a,n))//如果可以,递归进入下一行
                Queen(n,l+1);
            a[l][j]=0;//回溯回来后或者不可以放置皇后归0
        }
    }
    return;//如果是if,则递归出口,如果是else,则回溯到上一行
}
void Print(int (*a)[8],int n)
{//本算法打印出N皇后的解
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
}
bool CanPut(int i,int j,int (*a)[8],int n)
{//本算法是判断该位置能否放皇后
    int s=0;
    for(int k=i-1;k>=0;k--)
    {
        s++;
        if(a[k][j]==1 || j+s<n&&a[k][j+s]==1 || j-s>=0&&a[k][j-s]==1)
            return false;
    }
    return true;
}

作者:weixin_41133154
来源:CSDN
原文:https://blog.csdn.net/weixin_41133154/article/details/78986617
版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇下一篇

猜你喜欢

热点阅读