JAVA

作为一道经典的题目,那必然要用经典的dfs来做

dfs:深度优先搜索————纵向搜索符合条件的内容,走到底时回到上一个路口再走到底再回去,套娃至结束。

条件:在一个n*n的国际棋盘上摆放n个皇后,任意一个皇后所在位置的四条线(横、纵、对角、副对角)不能放置其他皇后。

思路:

  1. 可以想到每放置一个皇后我们就要移动到下一行,所以不需要对该行进行状态判断。只需要对列、主副对角线进行判断就可以了。

那么问题来了如何用一个值代表一条线呢

: 没什么好说的直接 col[y]

平面坐标系中的副对角线实际上也就是二维数组中的主对角线

所以得出:

任意一条副对角线公式为

y = x + b => b = y - x + n(数组中没有负数所以平移n位)

任意一条主对角线公式为

y = - x + b => b = x + y

主对角线: diagonal[x+y]

副对角线: cdiagonal[y-x+n]

b 是任意一条主副对角线到(0,0)的截距

那我们就可以通过一个一维数组来表示二维数组中的每一条主副对角线

至多会有2*n条主或副对角线,所以只需要开2n的空间就可以了

下面图随便看看

代码奉上

  1. import java.util.*;
  2. public class Main{
  3. static int n = 0;
  4. static String[][] path = new String[10][10];
  5. static boolean[] col = new boolean[20];
  6. static boolean[] diagonal = new boolean[20];
  7. static boolean[] cdiagonal = new boolean[20];
  8. public static void main(String[] args){
  9. Scanner read = new Scanner(System.in);
  10. n = read.nextInt();
  11. for(int i = 0;i < n;i++){
  12. for(int j = 0;j < n;j++){
  13. path[i][j] = ".";
  14. }
  15. }
  16. dfs(0);
  17. }
  18. public static void dfs(int k){
  19. if(k == n){
  20. for(int i = 0;i < n;i++){
  21. for(int j = 0;j < n;j++){
  22. System.out.print(path[i][j]);
  23. }
  24. System.out.println();
  25. }
  26. System.out.println();
  27. return;
  28. }
  29. for(int i = 0;i < n;i++){
  30. if(!col[i] && !diagonal[k+i] && !cdiagonal[i-k+n]){
  31. path[k][i] = "Q";
  32. col[i] = dg[k+i] = udg[i-k+n] = true;
  33. dfs(k+1);
  34. path[k][i] = ".";
  35. col[i] = dg[k+i] = udg[i-k+n] = false;
  36. }
  37. }
  38. }
  39. }

------------恢复内容结束------------

八皇后问题(n-皇后问题)的更多相关文章

  1. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  2. 八皇后问题 2n皇后问题

    Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某 ...

  3. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  4. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  5. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  6. 【leetcode-51,52】 N皇后,N皇后 II

     N皇后(hard) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题 ...

  7. 八皇后,回溯与递归(Python实现)

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

  8. 八皇后问题详细分析与解答(递归法解答,c#语言描述)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...

  9. VC版八皇后

    一.  功能需求: 1. 可以让玩家摆棋,并让电脑推断是否正确 2. 能让电脑给予帮助(给出全部可能结果) 3. 实现悔棋功能 4. 实现重置功能 5. 加入点按键音效果更佳 二.  整体设计计: 1 ...

  10. Python解决八皇后问题的代码【解读】

    八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...

随机推荐

  1. Excel提取身份证出生日期②

    问题场景 从user表中的身份信息中提取用户的出生日期: 以下方法也可适用于提取其他数据,不仅是身份证信息: 以下图中数据都为测试数据,不具备真实性! 场景一 user表中的18位身份证,提取出生日期 ...

  2. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  3. HM16.0之帧内模式——xCheckRDCostIntra()函数

    参考:https://blog.csdn.net/nb_vol_1/article/category/6179825/1? 1.源代码: Void TEncCu::xCheckRDCostIntra( ...

  4. latex:数学式中的省略符号

    数学式中有很多省略符号,具体命令符号和用法如下 数学式中的省略符号 \cdots 水平位置与减号等高,例如$-\cdots +$,得到- … + \ddots 对角省略号,例如$A\ddots M$, ...

  5. Python语言中的关键字(自己做的读书笔记)

    电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2015.1.1 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要输入 ...

  6. java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  7. Spring Cloud Alibaba是什么

    Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式 ...

  8. [CSP-S2019]格雷码 题解

    CSP-S2 2019 D1T1 考场上第一遍读题的时候感觉不是很一眼……不是很符合D1T1的气质 之前完全没听说过格雷码是什么玩意,还是我太菜了 仔细读题后发现应该是有规律可循的 赛后据说有$O(1 ...

  9. MySQL主从同步简单介绍&配置

    介绍: 现在mysql集群基本上都是使用一主多从方式,实现读写分离(主库写.从库读).负载均衡.数据备份,以前只是使用从未配置过,今天简单配置一下! mysql主从复制是通过binary log日志实 ...

  10. CKA认证经验贴(认证日期:20200817)

    一.背景 由于年初疫情影响,身处传统IT行业且兼职出差全国各地“救火”的我有幸被领导选中调研私有云平台,这就给我后来的认证之路做下了铺垫.之前调研kubernetes的v1.17版本自带kubeadm ...