DFS + 回溯法:N皇后问题

DFS + 回溯法:N皇后问题

问题:

在这里插入图片描述
在这里插入图片描述

思路:DFS+回溯

  DFS+回溯法解题是一种思想,不是说这道题目是图的题,非图的题可以使用这种思想解决
  我们可以建立一个dfs函数逐行遍历所有情况,dfs函数的参数有我们需要return的ans,当前行数row,N
  我们需要知道哪些点是被禁用的,因此我们需要创建标记数组。对于我们放皇后的点,与它同行、同列、以及在它所在的主对角线和副对角线上的点全部被禁用,由于我们是逐行遍历,因此不需要建立行的标记数组,因此我们需建立列标记数组、主对角线标记数组、副对角线标记数组

  列标记数组使用列的下标就可以了,主副对角线标记数组如何表示呢?我们可以注意到,在任一条主对角线上的元素,其列号-行号的值都相等,在任一条副对角线上的元素,其列号+行号的值都相等。 因此我们可以将列号-行号+N作为主对角线标记数组的下标,加N是为了防止列号-行号为负数,将列号+行号作为副对角线标记数组的下标。

  在每一行的dfs函数中,我们需要遍历该行的所有列,若当前遍历点没有禁用,在该点放皇后,更新标记数组,接下来调用dfs( ans,N,row+1 ),进入下一行,若从下一行返回,则相当于从树的子节点返回到它的父节点,此时表示这种情况已遍历完,需要移除当前的皇后,即回溯过程,需将之前更新的标记数组还原,以便遍历当前行的下一个点

  当row=N时,表示已经放完N个皇后,此时ans++,并return

代码:

# include <bits/stdc++.h>
using namespace std;
int table_main[30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happy19991001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值