返回

LeetCode 51:N 皇后解法巧妙解析,刷题打卡!

前端

序言:

在算法世界中,"N 皇后"问题以其巧妙的解题思路和实战应用价值而备受推崇。本篇文章将带你深入探索 LeetCode 51 "N 皇后"问题的解法,解锁刷题新姿势,为你的算法之旅注入一剂强心剂!

解题思路:

所谓 "N 皇后"问题,是指在一个 N x N 的棋盘上放置 N 个皇后,使它们彼此不能相互攻击。皇后彼此不能攻击的条件是:任何两个皇后都不能处于同一条横行、纵行或斜线上。

而回溯法是解决此类问题的有力武器。其基本框架如下:

  1. 从第一行第一列开始遍历棋盘;
  2. 依次尝试将皇后放置在当前位置;
  3. 如果皇后可以合法放置(不与其他皇后攻击),则继续下一行的遍历;
  4. 如果当前位置无法合法放置皇后,则回溯到上一个合法放置皇后的位置,并尝试下一列;
  5. 重复上述过程,直至遍历完整个棋盘或找到所有可行解。

代码实现:

public class NQueens {

    private int[] columns; // 记录每行皇后的列号
    private int count = 0; // 记录可行解数量

    public int totalNQueens(int n) {
        columns = new int[n];
        backtrack(0);
        return count;
    }

    private void backtrack(int row) {
        if (row == columns.length) {
            count++;
            return;
        }

        for (int col = 0; col < columns.length; col++) {
            if (isValid(row, col)) {
                columns[row] = col;
                backtrack(row + 1);
            }
        }
    }

    private boolean isValid(int row, int col) {
        for (int i = 0; i < row; i++) {
            if (columns[i] == col || Math.abs(columns[i] - col) == row - i) {
                return false;
            }
        }
        return true;
    }
}

结语:

通过回溯法的巧妙应用,我们成功破解了 "N 皇后"问题的难题。从解题思路到代码实现,本文深入浅出地剖析了问题的精髓,助力你轻松掌握算法技巧,在刷题的征途上越战越勇!