LeetCode: 51. N-Queens(Medium)
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)的更多相关文章
- LeetCode: 61. Rotate List(Medium)
1. 原题链接 https://leetcode.com/problems/rotate-list/description/ 2. 题目要求 给出一个链表的第一个结点head和正整数k,然后将从右侧开 ...
- LeetCode: 60. Permutation Sequence(Medium)
1. 原题链接 https://leetcode.com/problems/permutation-sequence/description/ 2. 题目要求 给出整数 n和 k ,k代表从1到n的整 ...
- LeetCode:11. ContainerWithWater(Medium)
原题链接:https://leetcode.com/problems/container-with-most-water/description/ 题目要求:给定n个非负整数a1,a2,...,an ...
- LeetCode: 62. Unique Paths(Medium)
1. 原题链接 https://leetcode.com/problems/unique-paths/description/ 2. 题目要求 给定一个m*n的棋盘,从左上角的格子开始移动,每次只能向 ...
- LeetCode: 56. Merge Intervals(Medium)
1. 原题链接 https://leetcode.com/problems/merge-intervals/description/ 2. 题目要求 给定一个Interval对象集合,然后对重叠的区域 ...
- LeetCode: 55. Jump Game(Medium)
1. 原题链接 https://leetcode.com/problems/jump-game/description/ 2. 题目要求 给定一个整型数组,数组中没有负数.从第一个元素开始,每个元素的 ...
- LeetCode: 54. Spiral Matrix(Medium)
1. 原题链接 https://leetcode.com/problems/spiral-matrix/description/ 2. 题目要求 给定一个二维整型数组,返回其螺旋顺序列表,例如: 最后 ...
- LeetCode:46. Permutations(Medium)
1. 原题链接 https://leetcode.com/problems/permutations/description/ 2. 题目要求 给定一个整型数组nums,数组中的数字互不相同,返回该数 ...
- LeetCode:18. 4Sum(Medium)
1. 原题链接 https://leetcode.com/problems/4sum/description/ 2. 题目要求 给出整数数组S[n],在数组S中是否存在a,b,c,d四个整数,使得四个 ...
- LeetCode:15. 3Sum(Medium)
1. 原题链接 https://leetcode.com/problems/3sum/description/ 2. 题目要求 数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整 ...
随机推荐
- 代码注释模板(把内容保存为xml文件,导入eclipse中即可)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><templa ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- Intellij IDEA 快速补全for循环:fori
快速补全for循环:fori 效果:
- PHP-----文件-----目录操作
目录操作 [1]创建目录(文件夹) mkdir("路径"); 例子: mkdir("./test"); 显示的结果: [2]删除目录(文件夹)只能删除空的文 ...
- HDU 1029 Ignatius and the Princess IV (map的使用)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1029 Ignatius and the Princess IV Time Limit: 2000/10 ...
- CSS-自定义变量
使用背景: 一些常见的例子: 为风格统一而使用颜色变量 一致的组件属性(布局,定位等) 避免代码冗余 *更方便的从CSS向JS传递数据(例如媒体断点) 为什么使用: 以下几点是未来CSS属性的简短说明 ...
- sudo命令: 在其他用户下操作root用户权限
一. 场景: 在某个远程服务器 A 上,用 账户1 登陆, 想要在root用户的目录下创建一个 .sh文件, 如果直接 用 touch test.sh 创建,会提示权限不足 此时可以用sudo命令: ...
- iOS7下Status Bar字体颜色修改
原文来自这里:iOS7下Status Bar字体颜色修改. 旧项目在iOS7上遇到status bar字体颜色需要修改的问题,症状如下:导航栏设置为黑色后,iphone上status bar的字体颜色 ...
- 学习笔记:IDEA、原生ajax的三道练习题、Markdown
前言 该从何说起呢?想写博客好久了,正好这个学期课很少(大三),可以静下心来写点东西(虽然事情依旧很多),总感觉记录和分享是一件很酷的事情.第一篇博客,第一次使用Markdown写博客,第一次使用ID ...
- Colored Boots题解
题目来自Codeforce 1141Dhttp://codeforces.com/problemset/problem/1141/D 因为是全英文题面,就先简单的阐述一下题面. 首先输入一个数n,然后 ...