算法基础之搜索与图论——n皇后问题

题目:n皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

在这里插入图片描述

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式
共一行,包含整数 n。

输出格式
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围
1≤n≤9

输入样例:
4

输出样例:
.Q…
…Q
Q…
…Q.

…Q.
Q…
…Q
.Q…

思想:
典型的DFS问题,每次遍历一遍可行的方案,记录一下限制信号,当遇到限制信号就回溯。我从第一行、第二行、第三行等从行数出发,在每一行寻找可以放下皇后的点,找到了就记录限制信号,并且寻找下一行,没找到就回溯。

对于限制信号,我用了三个bool数组l,x,ux 分别记录了一下列、正对角线、反对角线。如图
在这里插入图片描述
这些bool数组组成限制信号,对皇后放置的坐标进行限制。

而对于这些限制信号的x、ux数组下标, 我进行了计算,因为要使数组下标非负,并且能记录每一个对角线上的那些坐标,我决定将n*n的棋盘向y轴正向移动n个单位,这样对于正反对角线的数组都有非负数下标。如下图
在这里插入图片描述
上图中,棋盘的每一个点所在的正反对角线,其实就是函数y = x + b和y = - x + b,当棋盘上的两个点对应的对角线如果相同,说明此时他们构成的函数就有共同的b,所以只要b相同,那么这两个点就在一条对角线上。

代码中我用u表示第几行,i表示第几列,所以我们的y = 2n - u,x = i, 所以第0行第0列就是(0,2n),将y = 2n - u, x = i带入函数y = x + b,可以得到正对角线的 b = 2n - u - i,带入函数y = -x + b,可以得到反对角线的b = 2n - u + i。

代码如下&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值