当前位置: 代码迷 >> 综合 >> 算法_回溯_N皇后
  详细解决方案

算法_回溯_N皇后

热度:75   发布时间:2024-02-21 03:20:42.0

LeetCode 第 51 题

在一个 N×N 的国际象棋棋盘上放置 N 个皇后,每行一个并使她们不能互相攻击。给定一个整数 N,返回 N 皇后不同的的解决方案的数量。

 解题思路

解决 N 皇后问题的关键就是如何判断当前各个皇后的摆放是否合法。

class Solution {List<int[]> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {if(n == 0){return null;}int[] columns = new int[n];backtracking(0, columns, n);List<List<String>> ret = new ArrayList<>();for(int[] solution : res){List<String> element = new ArrayList<>();for(int i = 0; i < n; i++){int QPos = solution[i];char[] tempCharArray = new char[n];for(int k = 0; k < n; k++){tempCharArray[k] = '.';}tempCharArray[QPos] = 'Q';String tmpString = new String(tempCharArray);element.add(tmpString);}ret.add(element);}return ret;}public void backtracking(int row, int[] columns, int n){if(row == n){int[] a2 = Arrays.copyOf(columns, n);res.add(a2);return;}//尝试将皇后放置在每一列 for(int i = 0; i < n; i++){if(check(row, i, columns)){columns[row] = i;backtracking(row + 1, columns, n);}columns[row] = -1;}}public boolean check(int row, int col, int[] columns){//出错i < row,而不是nfor(int i = 0; i < row; i++){if(col == columns[i] || Math.abs(row - i) == Math.abs(col - columns[i])){return false;}}return true;}
}

解题心得:

<1>无法直接Arrays.asList(int[]);因为只有包装类才能作为参数,需要要转换成Integer[]

<2>思路正确,但在判断位置是否有效(check)函数中,i的判断条件是i < row,而非i < n,否则永远为false, 因为自己和自己肯定是在同一行啦~555(排错了近一个小时)

  相关解决方案