CSP考试复习:第三单元 搜索3.1 N 皇后问题

本文探讨了N皇后问题,即在N×N的国际象棋棋盘上放置N个皇后,使得它们互不攻击。文章通过深度优先搜索(DFS)方法进行解决,详细阐述了每步放置皇后的冲突检查与回溯过程,并提到了使用状态压缩以提高算法效率。
摘要由CSDN通过智能技术生成

3.1 N 皇后问题
【问题描述】在国际象棋中,皇后可以攻击与她在同一条水平线、垂直线和对角线的棋子。现在有一张 N×N
的国际象棋棋盘,在上面放置 N 个皇后。有多少种使皇后不能互相攻击的方案?(N≤13)
(1) 深度优先搜索(DFS)
逐列(行)搜索。每测试一个位置,就检查它是否与其他皇后冲突,如果冲突,回溯①。
每放置一个皇后,就要记录——所在列、“/”对角线和“\”对角线都不能放皇后了。

#include <iostream>
#include <cstring>
using namespace std;
bool column[20],cross1[50],cross2[50];
int pos[20];
int n, sum=0;
void dfs(int row)
{
if (row==n)
{
sum++;
return;
}
for (int i=0;i<n;i++)
if (!(column[i] || cross1[row-i+n] || cross2[row+i])) // 判断是否可以放置皇后
{
// 对皇后已经控制的列和对角线做标记
column[i]=cross1[row-i+n]=cross2[row+i]=true;
pos[row]=i;
dfs(row+1);
// 解除标记,这样才能在新位置上放置皇后。
column[i]=cross1[row-i+n]=cross2[row+i]=false;
}
}
int main()
{
cin>>n;
memset(column,0,sizeof(column));
memset(cross1,0,sizeof(cross1));
me
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值