N-Queens leetcode java
来源:互联网 发布:tcpip网络层安全协议 编辑:程序博客网 时间:2024/06/03 12:31
题目:
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."]
]
题解:
这道题很经典,网上有很多讲解实例。
在国际象棋中,皇后最强大,可以横竖斜的走(感谢AI课让我稍微对国际象棋了解了一下)。而八皇后问题就是让8个皇后中的每一个的横竖斜都没有其他皇后,这样其实感觉是一种和棋的状态。。
不知道说的对不对。。。毕竟真实棋盘中不能放8个皇后。。
额。。这道题是N皇后,我说着说着就说到了8皇后去了。。其实是一样的。。。
我这道题的解法也是参考了网上的一些人的讲法。
经典的DFS递归回溯解法,大体思路就是对每一行,按每一列挨个去试,试到了就保存结果没试到就回溯。
难点大概就是用1个一维数组存皇后所在的坐标值。对于一个棋盘来说,每个点都有横纵坐标,用横纵坐标可以表示一个点。
而这道题巧就巧在,每一行只能有一个皇后,也就是说,对于一行只能有一个纵坐标值,所以用1维数组能提前帮助解决皇后不能在同一行的问题。
那么用一维数组表示的话,方法是:一维数组的下标表示横坐标(哪一行),而数组的值表示纵坐标(哪一列)。
例如:对于一个4皇后问题,声明一个长度为4的数组(因为行数为4)。
A[] = [1,0,2,3]表达含义是:
当前4个皇后所在坐标点为:[[0,1],[1,0],[2,2],[3,3]](被我标蓝的正好是数组的下标,标粉的正好是数组的值)
相当于:A[0] = 1, A[1] = 0, A[2] = 2, A[3] = 3
这样以来,皇后所在的坐标值就能用一维数组表示了。
而正是这个一维数组,在回溯找结果的时候不需要进行remove重置操作了,因为回溯的话正好就回到上一行了,就可以再重新找下一个合法列坐标了。
因为是按照每一行去搜索的,当行坐标值等于行数时,说明棋盘上所有行都放好皇后了,这时就把有皇后的位置标为Q,没有的地方标为0。
按照上面讲的那个一维数组,我们就可以遍历整个棋盘,当坐标为(row,columnVal[row])的时候,就说明这是皇后的位置,标Q就行了。代码如下:
public ArrayList<String[]> solveNQueens(int n) { ArrayList<String[]> res = new ArrayList<String[]>(); if(n<=0) return res; int [] columnVal = new int[n]; DFS_helper(n,res,0,columnVal); return res; } public void DFS_helper(int nQueens, ArrayList<String[]> res, int row, int[] columnVal){ if(row == nQueens){ String[] unit = new String[nQueens]; for(int i = 0; i < nQueens; i++){ StringBuilder s = new StringBuilder(); for(int j = 0; j < nQueens; j++){ if(j == columnVal[i]) s.append("Q"); else s.append("."); } unit[i] = s.toString(); } res.add(unit); }else{ for(int i = 0; i < nQueens; i++){ columnVal[row] = i;//(row,columnVal[row)==>(row,i) if(isValid(row,columnVal)) DFS_helper(nQueens, res, row+1, columnVal); } } } public boolean isValid(int row, int [] columnVal){ for(int i = 0; i < row; i++){ if(columnVal[row] == columnVal[i] ||Math.abs(columnVal[row]-columnVal[i]) == row-i) return false; } return true; }Reference:
http://zh.wikipedia.org/wiki/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98
http://blog.csdn.net/linhuanmars/article/details/20667175
http://blog.csdn.net/u011095253/article/details/9158473http://www.cnblogs.com/springfor/p/3870944.html
阅读全文
0 0
- [Leetcode] N-Queens (Java)
- [LeetCode][Java] N-Queens
- leetcode:N-Queens 【Java】
- N-Queens leetcode java
- [Leetcode] N-Queens II (Java)
- [LeetCode][Java] N-Queens II
- [leetcode-51]N-Queens(java)
- leetcode:N-Queens II 【Java】
- (Java)LeetCode-51. N-Queens
- 【Leetcode】:51. N-Queens 问题 in JAVA
- (Java)LeetCode-52. N-Queens II
- 【LeetCode】N-Queens && N-Queens II
- leetcode N-Queens & N-Queens II
- Leetcode: N-Queens && N-Queens II
- 【Leetcode】【python】N-Queens/N-Queens II
- LeetCode: N-Queens II
- LeetCode: N-Queens
- LeetCode : N-Queens
- unity3d中让物体显示和隐藏
- JavaSE XML操作
- 好未来:n个数里出现次数大于等于n/2的数
- 【codevs1159】最大全0子矩阵(悬线法)
- laravel5.4+vue+element+vux环境搭建
- N-Queens leetcode java
- spring整合mongodb时出现的错误
- 1020(树状数组,逆序对+离散化)
- Android中图片占用内存的计算
- 目标检测的标注工具--集成环境版本labelImg
- SpringMVC的配置文件
- <Linux>详解Makefile变量
- [前缀和 乱搞]BZOJ4972 .小Q的方格纸
- xcode忽略警告