n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
…
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class SolveNQueens { public static void main(String[] args) { SolveNQueens queens = new SolveNQueens(); System.out.println(queens.solveNQueens(5)); } public List<List<String>> solveNQueens(int n) { List<List<String>> resp = new ArrayList<>(); Set<Integer> cols = new HashSet<>(); Set<Integer> pie = new HashSet<>(); Set<Integer> na = new HashSet<>(); dfs(n, 0, new ArrayList<>(), resp, cols, pie, na); return resp; } public void dfs(int max, int row, List<String> curState, List<List<String>> resp, Set<Integer> cols, Set<Integer> pie, Set<Integer> na) { // 终结条件 if (row >= max) { if (curState.size() == max) { resp.add(curState); } return; } // 循环列 for (int col = 0; col < max; col++) { if (cols.contains(col) || pie.contains(row + col) || na.contains(row - col)) { continue; } cols.add(col); pie.add(row + col); na.add(row - col); curState.add(trans(col, max)); int size = curState.size(); List<String> newState = (max - row == 1) ? new ArrayList<String>() {{ addAll(curState); }} : curState; // 递归层 dfs(max, row + 1, newState, resp, cols, pie, na); cols.remove(col); pie.remove(row + col); na.remove(row - col); curState.remove(size - 1); } } public String trans(int point, int max) { char[] chars = new char[max]; for (int i = 0; i < max; i++) { chars[i] = i == point ? 'Q' : '.'; } return String.valueOf(chars); } }
如果此文章能给您带来小小的提升,不妨小额赞赏我一下,以鼓励我写出更好的文章!
微信打赏
支付宝打赏