leetcode 51. N 皇后
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { public List<List<String>> solveNQueens(int n) { List<List<String>> all = new ArrayList<>(); if (n == 1) { List<String> list = new ArrayList<>(); list.add("Q"); all.add(list); return all; } // 采用回溯 int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[0] = i; totalNQueens(arr, 1, n, all); } return all; } public static void totalNQueens(int[] arr, int limit, int n, List<List<String>> all) { for (int i = 0; i < n; i++) { // 判断是发横竖斜是否有碰撞。 boolean flag = true; for (int k = 0; k < limit; k++) { int item = arr[k]; if (item == i || item - k == i - limit || item + k == i + limit) { flag = false; } } if (flag) { arr[limit] = i; if (limit != n - 1) { totalNQueens(arr, limit + 1, n, all); } else { add(arr, all, n); } } } } private static void add(int[] arr, List<List<String>> all, int n) { List<String> list = new ArrayList<>(n); for (int i = 0; i < n; i++) { int value = arr[i]; StringBuilder sb = new StringBuilder(n); for (int j = 0; j < value; j++) { sb.append('.'); } sb.append('Q'); for (int j = value + 1; j < n; j++) { sb.append('.'); } list.add(sb.toString()); } all.add(list); } }
leetcode中两道八皇后的题很类似,解法相同,采用数组记录的方式,效率不高,并且消耗内存较多,可以用位记录。