N皇后问题(C实现)
问题描述
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。
输入格式
输入中有一个正整数N≤10,表示棋盘和皇后的数量
输出格式
为一个正整数,表示对应输入行的皇后的不同放置数量。
样例输入
5
样例输出
10
数据规模和约定
N≤10
算法思路:
用递归的方式判断N*N棋盘上是否有通路,每行一个皇后,当要放置的棋子大于行数时,递归返回(即有一种解计数+1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int q[11]; //各皇后所在的行号
int cont = 0; //统计解得个数
//检验第i行的k列上是否可以摆放皇后
int find(int i, int k)
{
int j = 1;
while (j<i) //j=1~i-1是已经放置了皇后的行
{
//第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上
if (q[j] == k || abs(j - i) == abs(q[j] - k))
return 0;
j++;
}
return 1;
}
//放置皇后到棋盘上
void place(int k, int n)
{
int j;
if (k > n){
cont++;
return;
}
else
{
for (j = 1; j <= n; j++) //试探第k行的每一个列,试探出所有走法
{
if (find(k, j))
{
q[k] = j;
place(k + 1, n); //递归总是在成功完成了上次的任务的时候才做下一个任务
}
}
}
}
int main(void)
{
int n;
scanf("%d", &n);
place(1, n);
printf("%d\n", cont);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?