刷题38-N皇后问题

原题链接

题目描述

N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击。
即任意两个皇后都不能处于同一行、同一列或同一对角线上(正反)。

在这里插入图片描述

示例

输入:
4
输出:
[".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

解析

  1. 3皇后问题的图解分析(3皇后问题无解)
    在这里插入图片描述

  2. 可用一维数组array[]表示N皇后问题的解,array[i]的值表示第i行的皇后所在的列号。例如一个满足要求的四皇后棋盘布局如下图所示,其结果array数组的值为:[2, 4, 1, 3]。
    在这里插入图片描述

  3. 判定当前结点棋盘布局是否符合要求
    (1)array[i] == array[j],则第i行与第j行皇后在同一列上。
    (2)如果第i行的皇后在第s列,第j行皇后在第t列,即array[i] = s和array[j] = t,只要|i-j| == |s-t|(横纵坐标相减的绝对值相等),则皇后在同一对角线上。

  4. 遍历中要随时判定当前结点棋盘布局是否符合要求,符合要求则继续向下层遍历,直至判断得到一个满足约束条件的叶子结点(即到了最后一层),从而获得一个满足要求的棋盘布局;不符合要求的结点将被舍弃(称之为剪枝),并回溯到上一层的结点(上一层的循环)继续遍历。

参考解法

import java.util.ArrayList;
import java.util.Arrays;

public class Test {
   
    // 放在方法外,全局变量
    ArrayList<String[
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值