n皇后问题--回溯法,以DFS的方式搜索

本文介绍了如何使用深度优先搜索(DFS)的回溯法来解决n皇后问题。在n×n的棋盘上放置n个皇后,确保它们不在同一行、同一列或同一对角线上。通过以行为主导,逐行搜索并判断位置是否合法,实现皇后放置。当无法在当前行找到合适位置时,回溯至上一行继续搜索。代码展示了具体的实现过程。
摘要由CSDN通过智能技术生成
所谓一山不能容二虎,在 n×n 的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与

之在同一行、同一列、同一斜线上的棋子。设计算法在 n×n 的棋盘上放置 n 个皇后,使其彼此不受攻击。

输入:

4

输出:

2 4 1 3

3 1 4 2

可行方案数:2

问题分析:

题目要求不同行不同列不同斜线上,因为约束条件太多和考虑复杂度,我们不可能直接每个都枚举,可以先以行为主导,每行只放一个,找到可行的位置后就进行下一行的搜索,当某个位置放第t个皇后时,需要判断与前面已经放好的t-1个皇后的列和对角线时候相同,都不相同就可以在该位置放t皇后,判断是否在同一对角线可以用两位置行的差的绝对值和列的差的绝对值是否相等,可以以深度优先搜索的方式进行搜索,在t行的第i列判断时候可以放,可以放就向深一行进行搜索,不可以放就继续判断i+1,因为是n行n列的棋盘有n个皇后,说明每一行每一列都已经有一个且只有一个皇后,如果在第t行全部搜素都没有可行的位置说明下面几行继续放也没意义,这时就需要回溯,返回上一行继续搜索,直到n个皇后放完,当一种方案确定后也需要回溯继续搜索时候还有另外放方案。

代码:

#include<iostream>
#include<math.h>
using namespace std;
#define M 105
int n;//皇后
int x[M];//第M个皇后放在M行X[M]列
int num;//可行方案的个数
bool place(int t)
{//判断第
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值