LeetCode 51:N皇后(回溯)

tech2023-10-26  99

文章目录

题目示例代码(回溯)

题目

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例

输入:4 输出:[ [".Q…", // 解法 1 “…Q”, “Q…”, “…Q.”], ["…Q.", // 解法 2 “Q…”, “…Q”, “.Q…”] ] 解释: 4 皇后问题存在两个不同的解法

代码(回溯)

class Solution { List<List<String>> resultList = new ArrayList<>(); public List<List<String>> solveNQueens(int n) { //result[i]表示第i行的皇后的位置,也就是列下标 int[] result = new int[n]; backTrack(0,n,result); return resultList; } public void backTrack(int row,int n,int[] result){ if(row == n){ printResult(result); return; } for(int col=0;col<n;col++){ boolean flag = true; for(int i=0;i<row;i++){ //在同一列或者在同一斜线上 if(result[i] == col || Math.abs(result[i] - col) == Math.abs(i - row)){ flag = false; } } if(flag){ result[row] = col; backTrack(row + 1,n,result); } } } public void printResult(int[] result){ List<String> list = new ArrayList<>(); for(int i=0;i<result.length;i++){ StringBuilder sb = new StringBuilder(); for(int j=0;j<result.length;j++){ if(result[i] == j){ sb.append("Q"); }else{ sb.append("."); } } list.add(sb.toString()); } resultList.add(list); } }

参考链接:N皇后 java

最新回复(0)