参考博客: 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. 关于鼠标、键盘的几个例子
  2. mui 根据 json 数据动态创建列表
  3. php开发编程中心,Php编程
  4. Java基础学习(1)
  5. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )
  6. 整活插件 炉石传说_酒馆战旗整活插件 免安装版
  7. java 泛型 继承_java基础之泛型的继承
  8. 解决vue视图不渲染
  9. 引用Interop.SQLDMO.dll后的注意事项。
  10. 181123每日一句
  11. FlexSIM.ED v4.0 1CD(生产排程,虚拟管理,能力平衡软件)
  12. 硬盘安装Linux(ubuntu,centos)
  13. VMware ESXi Server 许可证注册方式
  14. 基于单片机多功能万年历系统毕业设计(完整资料)
  15. 以潘金莲和西门公子为例讲述Java静态代理和动态代理
  16. java两张png图片合成_java将两张图片合成
  17. matlab用eval函数,matlab—eval函数
  18. 数据结构通讯录查询系统
  19. python登录微信pc版_微信PC版2.9.0测试版更新:新增小程序面板
  20. 百度阅读软件测试,《百度软件测试方案模板.doc

热门文章

  1. Notepadd ++ PluginManager安装
  2. java怎么删除List中的指定元素
  3. Javascript面向对象编程(一):封装
  4. OpenDataSource,sql开放式数据源
  5. 【视频】SQL Server 2008 R2 StreamInsight - 多源复杂事件处理
  6. 汇编语言中,DS与BX有何区别?怎么搭配使用?(BX是通用寄存器)
  7. 1 2 5组合100,有多少种方法
  8. Lua table笔记
  9. outlook异常之:邮件输入模式转换
  10. SQL:找出我(uid=2)所有的好友信息,和这些好友发布的最新的一篇文章