在Java的面試中,八皇后問(wèn)題是一個(gè)經(jīng)典的回溯算法問(wèn)題。本文將介紹一道經(jīng)典的Java面試題——八皇后問(wèn)題,并提供詳細(xì)的解析和解題思路。
題目
在一個(gè)8x8的棋盤(pán)上放置8個(gè)皇后,使得它們彼此之間不能相互攻擊(即任意兩個(gè)皇后不能處于同一行、同一列或同一對(duì)角線上)。輸出所有可能的解。
解析與解題思路
八皇后問(wèn)題是一個(gè)經(jīng)典的回溯算法問(wèn)題,需要使用回溯的思想來(lái)解決。
首先,我們定義一個(gè)二維數(shù)組board表示棋盤(pán),其中每個(gè)元素代表棋盤(pán)的一個(gè)格子。初始化棋盤(pán)上的所有格子為0,表示空。
然后,我們使用遞歸的回溯算法來(lái)放置皇后。從棋盤(pán)的第一行開(kāi)始,對(duì)于每一列,我們判斷當(dāng)前位置是否可以放置皇后。如果可以放置,我們將當(dāng)前位置標(biāo)記為1,表示放置了皇后。然后,我們繼續(xù)遞歸地放置下一行的皇后。
在遞歸的過(guò)程中,我們需要進(jìn)行剪枝操作,即判斷當(dāng)前位置放置皇后后是否與已放置的皇后沖突。如果沖突,我們將當(dāng)前位置還原為0,繼續(xù)嘗試下一個(gè)位置。
當(dāng)放置完所有的皇后后,我們將當(dāng)前棋盤(pán)的狀態(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é)論
通過(guò)回溯算法,我們可以找到在8x8棋盤(pán)上放置8個(gè)皇后且彼此之間不相互攻擊的所有解。八皇后問(wèn)題是面試中常見(jiàn)的算法題目,掌握了解題思路和實(shí)現(xiàn)代碼,我們能夠在面試中更加自信地回答相關(guān)問(wèn)題。
學(xué)java,就到java編程獅!