n皇后问题求解

本文介绍了如何使用深度优先搜索(DFS)解决n皇后问题,确保每个皇后都不会相互攻击。讲解了如何判断皇后是否在同一行、列或对角线上,以及如何通过DFS实现递归放置皇后,并通过剪枝降低复杂度,避免重复输出正确解。还讨论了在输出解决方案时的注意事项。
摘要由CSDN通过智能技术生成

题目描述:

在一个n×n的棋盘上放置n个王后,使得每个王后不会相互攻击,即任意两个王后不在同一行、同一列、同一对角线上,输出所有的放置方式。

输入n,表示棋盘大小。

思路:

深度优先搜索(DFS):枚举第i个王后的放法,再枚举第i+1个王后的放置方法,直至放置完所有棋子,检查放置方式是否合法,若合法则输出;不合法则返回,尝试其他放置方式。

公用:

bool isValid(int n) //全部棋子放完之后判断是否合法的函数,主要判断任意两颗棋子是否在同一对角线上

isvalid函数判断是否在同一对角线上的依据是两个点(x1,y1),(x2,y2)是否存在x1+y1=x2+y2或x1-y1=x2-y2的情况。函数采用了两组数组记录棋子坐标的x和y,同一下标表示同一个点的x值或y值。
isvalid函数首先通过二重循环将n个放置好的棋子的坐标单独取出并记录,再通过二重循环将两个相邻的点进行比较,最后全部比较一遍,判断是否有两个点在同一对角线上,注意j=i+1的这种循环起始模式是判断相邻的。

注意:isvalid函数传参的时候也要注意传的是sum值,因为isvalid函数是判断n个棋子是否都放置合法了,所以要用sum,不然n会变。

for(int p=1;p<=n;++p)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值