App下載

經(jīng)典Java面試題解析:八皇后問題

特級(jí)不保護(hù)動(dòng)物 2023-07-11 09:25:49 瀏覽數(shù) (1222)
反饋

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

題目

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

解析與解題思路

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

首先,我們定義一個(gè)二維數(shù)組board表示棋盤,其中每個(gè)元素代表棋盤的一個(gè)格子。初始化棋盤上的所有格子為0,表示空。

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

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

當(dāng)放置完所有的皇后后,我們將當(dāng)前棋盤的狀態(tài)加入到結(jié)果列表中。

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

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

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

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

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

    private static boolean isValid(int[][] board, int row, int col) {
        // 檢查同一列是否有皇后
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 1) {
                return false;
            }
        }

        // 檢查左上對(duì)角線是否有皇后
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 1) {
                return false;
            }
        }

        // 檢查右上對(duì)角線是否有皇后
        for (int i = row - 1, j = col + 1; i >= 0 && j < board.length; i--, j++) {
            if (board[i][j] == 1) {
                return false;
            }
        }

        return true;
    }

    private static List<String> generateSolution(int[][] board) {
        List<String> solution = new ArrayList<>();
        for (int[] row : board) {
            StringBuilder sb = new StringBuilder();
            for (int cell : row) {
                sb.append(cell == 1 ? "Q" : ".");
            }
            solution.add(sb.toString());
        }
        return solution;
    }

    public static void main(String[] args) {
        int n = 8;
        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é)論

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

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


0 人點(diǎn)贊