博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode: N-Queens
阅读量:6036 次
发布时间:2019-06-20

本文共 2396 字,大约阅读时间需要 7 分钟。

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.."]]

这是一道NP的题目,解题套路与Sudoku Solver类似,类似题目参见. 主要思想就是一句话:用一个循环递归处理子问题。这个问题中,在每一层递归函数中,我们用一个循环把一个皇后填入对应行的某一列中,如果当前棋盘合法,我们就递归处理下一行,找到正确的棋盘我们就存储到结果集里面。这种题目都是使用这个套路,就是用一个循环去枚举当前所有情况,然后把元素加入,递归,再把元素移除,这道题目中不用移除的原因是我们用一个一维数组去存皇后在对应行的哪一列,因为一行只能有一个皇后,如果二维数组,那么就需要把那一行那一列在递归结束后设回没有皇后,所以道理是一样的。

这道题最后一个细节就是怎么实现检查当前棋盘合法性的问题,因为除了刚加进来的那个皇后,前面都是合法的,我们只需要检查当前行和前面行是否冲突即可。检查是否同列很简单,检查对角线就是行的差和列的差的绝对值不要相等就可以。

1 public class Solution { 2     public ArrayList
solveNQueens(int n) { 3 ArrayList
res = new ArrayList
(); 4 helper(n, 0, new int[n], res); 5 return res; 6 } 7 8 public void helper(int n, int currentrow, int[] colforrow, ArrayList
res) { 9 if (currentrow == n) { //find a suitable solution, add to result list10 String[] array = new String[n];11 for (int k = 0; k < n; k++) {12 StringBuffer buff = new StringBuffer();13 for (int m = 0; m < n; m++) {14 if (colforrow[k] == m) buff.append('Q');15 else buff.append('.');16 }17 String st = buff.toString();18 array[k] = st;19 }20 res.add(array);21 return;22 }23 24 for (int i = 0; i < n; i++) {25 colforrow[currentrow] = i;26 if (check(currentrow, colforrow)) {27 helper(n, currentrow+1, colforrow, res);28 } 29 }30 }31 32 public boolean check(int currentrow, int[] colforrow) {33 for (int temp = 0; temp < currentrow; temp++) {34 if (colforrow[temp] == colforrow[currentrow] || Math.abs(colforrow[temp] - colforrow[currentrow]) == Math.abs(temp - currentrow))35 return false;36 }37 return true;38 }39 }

 

转载地址:http://aflhx.baihongyu.com/

你可能感兴趣的文章
封装一个字母加数字的验证码
查看>>
同步/异步与阻塞/非阻塞的区别
查看>>
angularjs在ie10上,用ng-if以及translate国际化的问题
查看>>
sfs
查看>>
MySQL管理与优化(14):SQL优化
查看>>
★商场上的十则寓言故事!
查看>>
沙盒单机网站代表-Steam【推荐】
查看>>
Mac OS 批量删除.svn文件夹
查看>>
SDWebImageDecoder
查看>>
iOS 开发之设置UIButton的title
查看>>
ROCKETMQ——事务消息发送、消费示例
查看>>
oracle 锁表
查看>>
wordpress功能集成(四)改变评论框样式
查看>>
linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
查看>>
远程桌面发生身份验证错误,要求的函数不受支持
查看>>
Python---学习中遇到的错误
查看>>
Openldap NFS autofs configuration
查看>>
【工具使用系列】关于 MATLAB 符号运算,你需要知道的事
查看>>
java 快速排序
查看>>
hibernate id 生成策略
查看>>