leetcode52. N皇后 II 最强解法直接秒杀100%

举报
兔老大 发表于 2021/04/23 01:53:22 2021/04/23
【摘要】 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 示例: 输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [  [".Q..",  // 解法 1  &nb...

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

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

思路:详见:皇后问题详细解释。


  
  1. public class Solution {
  2. public int totalNQueens(int n) {
  3. // 因为本方法中位运算的载体是int型变量,所以该方法只能算1~32皇后问题
  4. // 如果想计算更多的皇后问题,需使用包含更多位的变量
  5. if (n < 1 || n > 32) {
  6. return 0;
  7. }
  8. int upperLim = n == 32 ? -1 : (1 << n) - 1;
  9. //upperLim的作用为棋盘大小,比如8皇后为00000000 00000000 00000000 11111111
  10. //32皇后为11111111 11111111 11111111 11111111
  11. return process2(upperLim, 0, 0, 0);
  12. }
  13. public int process2(int upperLim, int colLim, int leftDiaLim,
  14. int rightDiaLim) {
  15. if (colLim == upperLim) {
  16. return 1;
  17. }
  18. int pos = 0; //pos:所有的合法位置
  19. int mostRightOne = 0; //所有合法位置的最右位置
  20. //所有记录按位或之后取反,并与全1按位与,得出所有合法位置
  21. pos = upperLim & (~(colLim | leftDiaLim | rightDiaLim));
  22. int res = 0;//计数
  23. while (pos != 0) {
  24. mostRightOne = pos & (~pos + 1);//取最右的合法位置
  25. pos = pos - mostRightOne; //去掉本位置并尝试
  26. res += process2(
  27. upperLim, //全局
  28. colLim | mostRightOne, //列记录
  29. //之前列+本位置
  30. (leftDiaLim | mostRightOne) << 1, //左斜线记录
  31. //(左斜线变量+本位置)左移
  32. (rightDiaLim | mostRightOne) >>> 1); //右斜线记录
  33. //(右斜线变量+本位置)右移(高位补零)
  34. }
  35. return res;
  36. }
  37. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104126778

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。