1. 原题链接

https://leetcode.com/problems/n-queens/description/

2. 题目要求

游戏规则:当两个皇后位于同一条线上时(同一列、同一行、同一45度斜线、同一135度斜线)时,便可以消灭其中一个皇后

给出一个n*n的棋盘,要求棋盘上的n个皇后都不能被其他皇后吃掉,给出棋盘上n个皇后所有的摆放情况。

‘Q’代表此处放的是皇后,‘.’代表此处为空

4皇后的输出结果形式:

[[.Q.., ...Q, Q..., ..Q.],
[..Q., Q..., ...Q, .Q..]]

3. 解题思路

1. 将n*n的棋盘用一个长度为8的String类型数组表示,每一个元素代表棋盘中的一行,由长度为8的字符串表示,例如:

String[] queens = {".......Q", "...Q....", "Q.......", "..Q.....", ".....Q..", ".Q......", "......Q.", "....Q..."};

2. 采用回溯的思想进行迭代,该位置满足则设为Q,否则回溯到上一步,重新选择列的位置进行迭代

4. 代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class NQueens51 {
public static void main(String[] args) {
NQueens51 nq = new NQueens51();
List<List<String>> res = nq.solveNQueens(8);
System.out.println(res.size()); for (List l : res) {
System.out.println(l.toString());
for(Object str:l){
System.out.println(str);
}
System.out.println("-------------------");
}
} public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<List<String>>();
String[] queens = new String[n]; // 每一行用n个'.'填充
char[] initial = new char[n];
Arrays.fill(initial, '.'); // n*n的棋盘用n行'.'填充
Arrays.fill(queens, String.valueOf(Arrays.copyOf(initial, n))); // 45度斜线+135度斜线+n列
int[] flag = new int[5 * n - 2];
Arrays.fill(flag, 1); backtracking(res, queens, flag, 0, n);
return res;
} private void backtracking(List<List<String>> res, String[] queens, int[] flag, int row, int n) {
if (row == n) {
res.add(new ArrayList<String>(Arrays.asList(queens)));
return;
}
for (int col = 0; col != n; col++) { if (flag[col] == 1 && flag[n + col + row] == 1 && flag[4 * n - 2 + col - row] == 1) { // 判断列和两条斜线上是否有'Q'
flag[col] = 0; // 该列flag设为1,说明该列已经有Q了 flag[n + col + row] = 0; // 45度斜线上的flag设为0 flag[4 * n - 2 + col - row] = 0; // 135度斜线上的flag设为0
char[] chars = queens[row].toCharArray(); chars[col] = 'Q';
queens[row] = String.valueOf(chars); backtracking(res, queens, flag, row + 1, n); chars = queens[row].toCharArray();
chars[col] = '.';
queens[row] = String.valueOf(chars); flag[col] = 1;
flag[n + col + row] = 1;
flag[4 * n - 2 + col - row] = 1;
}
}
}
}

  运行结果:

一共有92中排列方式

LeetCode: 51. N-Queens(Medium)的更多相关文章

  1. LeetCode: 61. Rotate List(Medium)

    1. 原题链接 https://leetcode.com/problems/rotate-list/description/ 2. 题目要求 给出一个链表的第一个结点head和正整数k,然后将从右侧开 ...

  2. LeetCode: 60. Permutation Sequence(Medium)

    1. 原题链接 https://leetcode.com/problems/permutation-sequence/description/ 2. 题目要求 给出整数 n和 k ,k代表从1到n的整 ...

  3. LeetCode:11. ContainerWithWater(Medium)

    原题链接:https://leetcode.com/problems/container-with-most-water/description/ 题目要求:给定n个非负整数a1,a2,...,an  ...

  4. LeetCode: 62. Unique Paths(Medium)

    1. 原题链接 https://leetcode.com/problems/unique-paths/description/ 2. 题目要求 给定一个m*n的棋盘,从左上角的格子开始移动,每次只能向 ...

  5. LeetCode: 56. Merge Intervals(Medium)

    1. 原题链接 https://leetcode.com/problems/merge-intervals/description/ 2. 题目要求 给定一个Interval对象集合,然后对重叠的区域 ...

  6. LeetCode: 55. Jump Game(Medium)

    1. 原题链接 https://leetcode.com/problems/jump-game/description/ 2. 题目要求 给定一个整型数组,数组中没有负数.从第一个元素开始,每个元素的 ...

  7. LeetCode: 54. Spiral Matrix(Medium)

    1. 原题链接 https://leetcode.com/problems/spiral-matrix/description/ 2. 题目要求 给定一个二维整型数组,返回其螺旋顺序列表,例如: 最后 ...

  8. LeetCode:46. Permutations(Medium)

    1. 原题链接 https://leetcode.com/problems/permutations/description/ 2. 题目要求 给定一个整型数组nums,数组中的数字互不相同,返回该数 ...

  9. LeetCode:18. 4Sum(Medium)

    1. 原题链接 https://leetcode.com/problems/4sum/description/ 2. 题目要求 给出整数数组S[n],在数组S中是否存在a,b,c,d四个整数,使得四个 ...

  10. LeetCode:15. 3Sum(Medium)

    1. 原题链接 https://leetcode.com/problems/3sum/description/ 2. 题目要求 数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整 ...

随机推荐

  1. postgres if ,when及判断表是否存在的sql编写

    判断表是否存在方法1: SELECT THEN END FROM ( select count(*) as cc from pg_class where relname = 'wo' --wo is ...

  2. BIND简易教程(2):BIND视图配置

    目录:BIND简易教程(1):安装及基本配置BIND简易教程(2):BIND视图配置(本篇)BIND简易教程(3):DNSSec配置 上文书说到,我们把aaa.apple.tree解析到192.168 ...

  3. BZOJ4887:[TJOI2017]可乐(矩阵乘法)

    Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市,自爆. ...

  4. Integer类小细节随笔记录

    先看一段简单的代码: Integer v1 = Integer.valueOf(12); Integer v2 = Integer.valueOf(12); Integer v3 = Integer. ...

  5. 使用QT开发GoogleMap瓦片显示和下载工具(2)——Google地图瓦片投影和获取网址解析

    这篇主要说的是Google地图采用的投影方式,瓦片划分方式以及如何从给定的经纬度获取瓦片的数据的网址.所有资料均来自于网络,并亲自试验可行. Google地图投影 首先是地图投影问题,因为地球本身是一 ...

  6. java _this关键字的用法

    1:This关键字可以用于从一个构造方法调用另一个构造方法,可以用于避免重复代码 2:this的第二个用于this.xxx表示成员变量,成员变量的作用范围是  类   避免产生歧义 package c ...

  7. java 编写小工具 尝试 学习(一)

    1.单片机 调试经常 需要  用 串口 工具 发送 一些 特定的  协议或者 命令,每次要 翻译  写成 2进制 很麻烦 ,因此 打算自己用 java 写一个 工具 方便自己  调试,2017年3月2 ...

  8. hadoop-2.2.0 HA配置

    采用的是4台真实机器: namenode:qzhong  node27 datanode:qzhong node27 node100 node101 操作系统环境:qzhong(Ubuntu-14.0 ...

  9. iOS universallinks唤醒app

    从iOS9之后,苹果就推出了这个功能,用来唤醒外部app.这个功能在那些电商app上使用尤其广泛,当你打开对应的h5网页后,上面跳出一个是否跳转app的按钮. 现在iOS11已经基本覆盖,iOS12也 ...

  10. JS中some(),every(),fiflter(),map()各种循环的区别理解

    1.some():返回一个Boolean,判断是否有元素符合func条件const arr = [1,2,3,4]; arr.some((item)=>{return item>1}) 打 ...