LeetCode 50 N-Queens
2014-11-10 18:22
399 查看
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
indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
思路:回溯法,使用ArrayList<Integer> al来存储某个皇后的列,而它在ArrayList的索引就是其行数。
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.."] ]
思路:回溯法,使用ArrayList<Integer> al来存储某个皇后的列,而它在ArrayList的索引就是其行数。
public class Solution { public List<String[]> solveNQueens(int n) { List<String[]> result = new LinkedList<String[]>(); search(result, n, new ArrayList<Integer>(), 1); return result; } private boolean isValid(List<Integer> list) { int column = list.get(list.size() - 1); for (int i = 0; i < list.size() - 1; i++) { if (column == list.get(i) || Math.abs(column - list.get(i)) == Math.abs(list.size() - 1 - i)) { return false; } } return true; } private void search(List<String[]> result, int n, List<Integer> list, int col) { if (col > n) { char[] temp = new char ; Arrays.fill(temp, '.'); String[] str = new String ; for (int i = 0; i < list.size(); i++) { StringBuilder sb = new StringBuilder(String.valueOf(temp)); sb.setCharAt(list.get(i), 'Q'); str[i] = sb.toString(); } result.add(str); } else { for (int j = 0; j < n; j++) { list.add(j); if (isValid(list)) { search(result, n, list, col + 1); } list.remove(list.size() - 1); } } } }思路2:回溯法,只不过使用了位移操作,更快,剪枝剪得更厉害,详细分析见/article/1578301.html
public class Solution { static int upperlim = 1; private void search(int l, int ld, int rd, List<Integer> list, List<String[]> result) { if (l != upperlim) { int pos = upperlim & (~(l | ld | rd)); while (pos != 0) { int p = pos & -pos; int temp = p; int index = 0; while (temp != 1) { temp = temp >> 1; index++; } list.add(index);// 从0开始的 pos ^= p; search(l | p, (ld | p) << 1, (rd | p) >> 1, list, result); list.remove(list.size() - 1); } } else { char[] temp = new char[list.size()]; Arrays.fill(temp, '.'); String[] str = new String[list.size()]; for (int i = 0; i < list.size(); i++) { StringBuilder sb = new StringBuilder(String.valueOf(temp)); sb.setCharAt(list.get(i), 'Q'); str[i] = sb.toString(); } result.add(str); } } public List<String[]> solveNQueens(int n) { upperlim = (1 << n) - 1; List<String[]> result = new LinkedList<String[]>(); search(0, 0, 0, new LinkedList<Integer>(), result); return result; } }
相关文章推荐
- LeetCode 50 51 N-Queens (启发式搜索)
- leetcode[50] N-Queens
- 《leetCode》:N-Queens(奇葩的测试平台,居然不能AC)
- N-Queens N皇后问题@LeetCode
- LeetCode N-Queens
- leetcode 50 值得再看一遍
- Leetcode N-Queens
- leetcode — n-queens
- LeetCode 50 Pow(x, n)
- Leetcode:51. N-Queens
- N 皇后问题 : Leetcode 51. N-Queens
- LeetCode_50_Pow(x, n)
- (java)leetcode-51:N-Queens
- LeetCode---(50)Pow(x, n)
- 52. N-Queens II Leetcode Python
- [LeetCode]N-Queens
- 【LeetCode】506. Relative Ranks【E】【50】
- Leetcode:N-Queens
- Leetcode50: Ugly Number
- Leetcode-N-Queens