经典Java面试题解析:N皇后问题

2023-07-11 09:30:22 浏览数 (763)

在Java的面试中,N皇后问题是一个经典的回溯算法问题。本文将介绍一道经典的Java面试题——N皇后问题,并提供详细的解析和解题思路。

题目

在一个N×N的棋盘上放置N个皇后,使得它们彼此之间不能相互攻击(即任意两个皇后不能处于同一行、同一列或同一对角线上)。输出所有可能的解。

解析与解题思路 

N皇后问题是一个经典的回溯算法问题,需要使用回溯的思想来解决。

首先,我们定义一个一维数组queens,其中queens[i]表示第i行的皇后所在的列。初始化queens数组的所有元素为-1,表示初始状态下每行的皇后都未放置。

然后,我们使用递归的回溯算法来放置皇后。从棋盘的第一行开始,对于每一列,我们判断当前位置是否可以放置皇后。如果可以放置,我们将该位置标记为当前行的列数,并继续递归地放置下一行的皇后。

在递归的过程中,我们需要进行剪枝操作,即判断当前位置放置皇后后是否与已放置的皇后冲突。如果冲突,我们继续尝试下一个位置。

当放置完所有的皇后后,我们将当前皇后的位置转化为对应的解,即将queens数组转化为棋盘状态,并将该解加入到结果列表中。

以下是Java代码实例:

import java.util.ArrayList;
import java.util.List;

public class NQueens {
    public static List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<>();
        int[] queens = new int[n];
        backtrack(queens, 0, result);
        return result;
    }

    private static void backtrack(int[] queens, int row, List<List<String>> result) {
        if (row == queens.length) {
            result.add(generateSolution(queens));
            return;
        }

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

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

    private static List<String> generateSolution(int[] queens) {
        List<String> solution = new ArrayList<>();
        for (int queen : queens) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < queens.length; i++) {
                if (i == queen) {
                    sb.append("Q");
                } else {
                    sb.append(".");
                }
            }
            solution.add(sb.toString());
        }
        return solution;
    }

    public static void main(String[] args) {
        int n = 4;
        List<List<String>> solutions = solveNQueens(n);
        for (List<String> solution : solutions) {
            System.out.println("解法:");
            for (String row : solution) {
                System.out.println(row);
            }
            System.out.println();
        }
    }
}

结论

通过回溯算法,我们可以找到在N×N棋盘上放置N个皇后且彼此之间不相互攻击的所有解。N皇后问题是面试中常见的算法题目,掌握了解题思路和实现代码,我们能够在面试中更加自信地回答相关问题。

 学java,就到java编程狮