DFS--n皇后问题

本文探讨了N皇后问题,这是一个经典的计算机科学问题,目标是在N×N的棋盘上放置N个皇后,使得它们互不攻击。文章介绍了判断对角线上是否有皇后的关键条件,并提供了一个使用深度优先搜索(DFS)的C++实现,通过预计算避免超时。此外,还展示了如何统计不同合法放置的数量,并给出了样例输入输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,要知道一个矩阵的知识
(左上向右下)对角线上的元素,行数减列数的值相等(主对角线的话等于0)
(右上向左下)对角线上的元素,行数加列数的值相等。

所以,在n皇后问题中,我们要通过这一性质,判断对角线上是否已经有皇后了。

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10

打表

#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>

using namespace std;

int v1[20], v2[20], v3[20];
int n, tot;
void dfs(int x)
{
	int i;
	if (x == n + 1)
	{
		tot++;
		return;
	}
	else
		for (i = 1;i <= n;i++)
		{
			if (!v1[i] && !v2[x + i] && !v3[n + x - i])//判断该列、两条对角线的情况
			{
				v1[i] = v2[x + i] = v3[n + x - i] = 1;
				dfs(x+1);//不能是x++或++x,因为在这层dfs中x的值表示行数不能变
				v1[i] = v2[x + i] = v3[n + x - i] = 0;
			}
		}
}
int main(void)
{
	int i, aa[20];
	for (i = 1;i <= 10;i++)//打表,避免超时
	{
		tot=0;
		memset(v1, 0, sizeof(v1));
		memset(v2, 0, sizeof(v2));
		memset(v3, 0, sizeof(v3));
		n = i;
		dfs(1);
		aa[n] = tot;
	}
	while (cin >> n && n)
	{
		cout << aa[n] << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值