参考博客: https://blog.csdn.net/weixin_39651041/article/details/79972829

题目描述

NN皇后问题是指在N*NN∗N的棋盘上要摆NN个皇后,
要求:任何两个皇后不同行,不同列也不再同一条斜线上,
求给一个整数NN,返回NN皇后的摆法数。

示例1

输入

1

返回值

1

示例2

输入

8

返回值

92

思路如下:

由于N皇后问题不允许两个皇后在同一行,所以,可用一维数组X表示N皇后问题的解,X[i]表示第i行的皇后所在的列号。例如一个满足要求的四皇后棋盘布局如下图所示,其结果X数组的值为:[2, 4, 1, 3]。

由上述X数组求解N皇后问题,保障了任意两个皇后不在同一行上,而判定皇后彼此不受攻击的其他条件,可以描述如下:

(1)X[i] = X[s],则第i行与第s行皇后在同一列上。

(2)如果第i行的皇后在第j列,第s行皇后在第t列,即X[i] = j和X[s] = t,则只要i-j = s-t或者i+j = s+t,说明两个皇后在同一对角线上。

对两个等式进行变换后,得到结论:只要|i-s| = |j-t|(即i-s = X[i]-X[s]),则皇后在同一对角线上。

public class NqueenMe {int resultCount = 0;public static void main(String[] args) {//int[] queen = new int[8];NqueenMe nqueenMe = new NqueenMe();nqueenMe.Nqueen(9);System.out.println(nqueenMe.resultCount);}public  int Nqueen (int n) {int[] queen = new int[n];tria(queen,0,n);return resultCount;}private void tria(int[]arr, int i, int n){if(i >= n){++resultCount;for (int j = 0; j < n; j++) {System.out.print(arr[j]+" ");}System.out.println();}else{for (int j = 0; j < n; j++) {arr[i] = j; // 第i行第j列if(place(arr, i)){// 结点满足约束条件,则递归进入下一层继续遍历,否则跳过tria(arr, i+1, n);}}}}private boolean place(int[] arr, int s){// 判定s行X[s]位置上的皇后,与1至s-1行上各皇后的位置是否满足约束条件for (int i = 0; i < s; i++) {// 同一列 或者 处于对角线if(arr[i] == arr[s] || (Math.abs(i-s) == Math.abs(arr[i] - arr[s]))){return false;}}return true;}}

常考数据结构与算法:N皇后问题相关推荐

  1. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  2. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  3. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  4. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  5. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  6. 常考数据结构与算法:两个链表生成相加链表

    题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 例如:链表 1 为 9->3->7,链表 ...

  7. 常考数据结构与算法:买卖股票的最好时机

    题目描述 假设你有一个数组,其中第 i 个元素是股票在第i 天的价格. 你有一次买入和卖出的机会.(只有买入了股票以后才能卖出).请你设计一个算法来计算可以获得的最大收益. 示例 1: 输入: [8, ...

  8. 常考数据结构和算法:设计LRU缓存结构

    题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...

  9. 常考数据结构与算法:每k个节点反转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

最新文章

  1. PTA数据结构与算法题目集 6-9 二叉树的遍历
  2. 大学python和vb哪个简单-vb和python哪个速度快
  3. Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue
  4. oralce EM企业管理器
  5. 直播平台实现视频监控
  6. 等待线程结束(join)
  7. 转:CRC校验之模2除法
  8. linux gcc换成c99标准,关于GCC和C99中可变参数宏
  9. 学习笔记(01):10小时掌握区块链开发教程-2小时构建以太坊智能合约-1
  10. OBS美颜滤镜插件(BF+)——OBS美颜解决办法
  11. 图像处理:图像清晰度评价
  12. House of apple 一种新的glibc中IO攻击方法
  13. ROS2 基础概念 服务
  14. Java高级开发必备--Docker进阶(一篇详细教程,进阶Docker)
  15. input标签type=“week“选择第几周
  16. 阿里云盘内测申请_阿里云网盘强势来袭,内测资格速速申请
  17. 网络安全基础——ARP欺骗
  18. 蓝桥杯第九到十二届C/C++A组省赛填空题集 (很全)
  19. Vue 随笔1-加入vue router 后发现app被渲染了2次
  20. 企业如何借助三方表格控件,实现多人在线协同编辑?

热门文章

  1. PHP HashTable总结
  2. VS2013试用期结束后如何激活
  3. 第1次作业+105032014074
  4. sh脚本异常:bad interpreter: No such file or directory
  5. 按钮在执行frame动画的时候怎么响应触发事件?
  6. 线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
  7. 香港科技园公司“牵手”腾讯 共推香港金融科技发展
  8. maven jdk 版本配置
  9. mysql binlog日志优化及思路
  10. 关于怎么将Quartus和Nios程序一起固化到FPGA里面