美文网首页
2018-11-03

2018-11-03

作者: 海上生明月_c2c3 | 来源:发表于2018-11-03 12:57 被阅读0次
    #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
    版权声明:本文为博主原创文章,转载请附上博文链接!

    相关文章

      网友评论

          本文标题:2018-11-03

          本文链接:https://www.haomeiwen.com/subject/wlskxqtx.html