App下載

經(jīng)典Java面試題解析:N皇后問(wèn)題

花開(kāi)一夜 2023-07-11 09:30:22 瀏覽數(shù) (1639)
反饋

在Java的面試中,N皇后問(wèn)題是一個(gè)經(jīng)典的回溯算法問(wèn)題。本文將介紹一道經(jīng)典的Java面試題——N皇后問(wèn)題,并提供詳細(xì)的解析和解題思路。

題目

在一個(gè)N×N的棋盤(pán)上放置N個(gè)皇后,使得它們彼此之間不能相互攻擊(即任意兩個(gè)皇后不能處于同一行、同一列或同一對(duì)角線(xiàn)上)。輸出所有可能的解。

解析與解題思路 

N皇后問(wèn)題是一個(gè)經(jīng)典的回溯算法問(wèn)題,需要使用回溯的思想來(lái)解決。

首先,我們定義一個(gè)一維數(shù)組queens,其中queens[i]表示第i行的皇后所在的列。初始化queens數(shù)組的所有元素為-1,表示初始狀態(tài)下每行的皇后都未放置。

然后,我們使用遞歸的回溯算法來(lái)放置皇后。從棋盤(pán)的第一行開(kāi)始,對(duì)于每一列,我們判斷當(dāng)前位置是否可以放置皇后。如果可以放置,我們將該位置標(biāo)記為當(dāng)前行的列數(shù),并繼續(xù)遞歸地放置下一行的皇后。

在遞歸的過(guò)程中,我們需要進(jìn)行剪枝操作,即判斷當(dāng)前位置放置皇后后是否與已放置的皇后沖突。如果沖突,我們繼續(xù)嘗試下一個(gè)位置。

當(dāng)放置完所有的皇后后,我們將當(dāng)前皇后的位置轉(zhuǎn)化為對(duì)應(yīng)的解,即將queens數(shù)組轉(zhuǎn)化為棋盤(pán)狀態(tài),并將該解加入到結(jié)果列表中。

以下是Java代碼實(shí)例:

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();
        }
    }
}

結(jié)論

通過(guò)回溯算法,我們可以找到在N×N棋盤(pán)上放置N個(gè)皇后且彼此之間不相互攻擊的所有解。N皇后問(wèn)題是面試中常見(jiàn)的算法題目,掌握了解題思路和實(shí)現(xiàn)代碼,我們能夠在面試中更加自信地回答相關(guān)問(wèn)題。

 學(xué)java,就到java編程獅!


0 人點(diǎn)贊