#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;
}
}
}
![](https://profile-avatar.csdnimg.cn/90bc7ca4e3d147dcadfbb9a11812baea_qq_62527659.jpg!4)
N皇后问题求解,为什么数组大小至少为13才能求出8个N皇后的解呀,按理说求8个N皇后不是8*8的棋盘就够了吗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
悬赏问题
- ¥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