Tycheuv 2021-12-29 14:37 采纳率: 0%
浏览 17

N皇后问题求解,为什么数组大小至少为13才能求出8个N皇后的解呀,按理说求8个N皇后不是8*8的棋盘就够了吗


#include <stdio.h>

int board[12][12];//棋盘数组
int cont=0;//记录解的个数
int main()
{
    void df(int x,int N);
    int n;
    scanf("%d",&n);
    df(0,n);
    printf("%d",cont);
    return 0;
}

void df(int x,int N)//递归求解
{
    int i,j,t,n=N;
    for(i=0;i<N;i++)
    {
        if(board[x][i]==0)//如果当前位置为0,说明跟之前的几个皇后没有冲突,此位置放一个皇后
        {
            if(x==N-1)//当查询到最后一行时,解的个数加一,进入下次循环
            {
                cont++;
                continue;
            }
            else//以皇后为中心的八个方向数值加一
            {
                for(t=0;t<N;t++)
                    board[t][i]+=1;
                for(j=0;j<N;j++)
                    board[x][j]+=1;
                for(t=x,j=i;j<N,t<N;j++,t++)
                    board[t][j]+=1;
                for(t=x,j=i;j>0,t>0;j--,t--)
                    board[t][j]+=1;
                for(t=x,j=i;j<N,t>0;j++,t--)
                    board[t][j]+=1;
                for(t=x,j=i;j>0,t<N;j--,t++)
                    board[t][j]+=1;
                df(x+1,n);//递归寻找下一个皇后
            }//回溯到此之后清空上一个节点所引起的变化
            for(t=0;t<N;t++)
                board[t][i]-=1;
            for(j=0;j<N;j++)
                board[x][j]-=1;
            for(t=x,j=i;j<N,t<N;j++,t++)
                board[t][j]-=1;
            for(t=x,j=i;j>0,t>0;j--,t--)
                board[t][j]-=1;
            for(t=x,j=i;j<N,t>0;j++,t--)
                board[t][j]-=1;
            for(t=x,j=i;j>0,t<N;j--,t++)
                board[t][j]-=1;
        }
    }
}

img

  • 写回答

1条回答 默认 最新

  • Admini$trat0r .net领域新星创作者 2021-12-29 14:50
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 12月29日

悬赏问题

  • ¥30 不会,学习,有偿解答
  • ¥15 SQL查询语句报错(检查)
  • ¥15 此表中公式应该怎么写
  • ¥15 求HI-TECH PICC 9.50 PL3安装包
  • ¥15 在Windows中运行ollama出现运行缓慢的情况
  • ¥15 下载ctorch报错,求解
  • ¥15 如何将这段css代码应用于wordpress的elementor的单个小部件中显示,而不是整个网站全局显示。
  • ¥15 如何入门学习c语言,单片机
  • ¥15 idea 编辑语言的选择
  • ¥15 Windows下部署Asmjit