N皇后算法,Java代码

当解决N皇后问题时,我们的目标是将N个皇后放置在一个NxN的棋盘上,使得它们互相之间无法互相攻击。皇后可以在同一行、同一列和同一对角线上攻击其他皇后。

下面是一个用Java实现的N皇后问题的算法,我将逐行解析代码:

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

public class NQueens {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<>();
        int[] queens = new int[n];
        solveNQueensHelper(result, queens, 0, n);
        return result;
    }
    
    private void solveNQueensHelper(List<List<String>> result, int[] queens, int row, int n) {
        if (row == n) {
            // 找到一个解,将结果添加到最终结果列表中
            result.add(generateBoard(queens));
        } else {
            for (int col = 0; col < n; col++) {
                if (isValid(queens, row, col)) {
                    queens[row] = col;  // 在当前行的col列放置皇后
                    solveNQueensHelper(result, queens, row + 1, n);  // 递归调用下一行
                }
            }
        }
    }
    
    private boolean isValid(int[] queens, int row, int col) {
        for (int i = 0; i < row; i++) {
            if (queens[i] == col || Math.abs(queens[i] - col) == row - i) {
                // 在同一列或同一对角线上已经有皇后
                return false;
            }
        }
        return true;
    }
    
    private List<String> generateBoard(int[] queens) {
        List<String> board = new ArrayList<>();
        for (int i = 0; i < queens.length; i++) {
            char[] row = new char[queens.length];
            Arrays.fill(row, '.');
            row[queens[i]] = 'Q';
            board.add(new String(row));
        }
        return board;
    }
}

现在我们逐个解析代码:

  1. 首先,我们引入了必要的类ArrayListList,它们用于存储和操作结果。
  2. 然后,我们定义了一个名为NQueens的类。
  3. NQueens类中,我们有一个solveNQueens方法,它接受一个整数n作为参数,并返回一个列表result,其中包含所有的解。
  4. solveNQueens方法内部,我们创建一个空的列表result用于存储最终结果。
  5. 接下来,我们创建一个长度为n的整数数组queens,用于存储皇后在每一行的列索引。
  6. 我们调用solveNQueensHelper方法来寻找解,传递resultqueens0n作为参数。
  7. solveNQueensHelper方法是一个递归函数,

它使用回溯法来解决N皇后问题。回溯法是一种通过尝试所有可能的选择来找到解的方法。

  1. 首先,我们检查如果row等于n,表示我们找到了一个解,将当前皇后的位置转换为棋盘形式,并将其添加到最终结果列表result中。

  2. 否则,我们使用一个循环来尝试在当前行的每一列放置皇后。

  3. 对于每一列,我们通过调用isValid方法来检查当前位置是否是一个有效的选择。

  4. isValid方法用于检查当前位置是否与之前的皇后位置冲突,即是否在同一列或同一对角线上。

  5. 如果位置有效,我们将当前位置的列索引存储在queens数组的row位置上,并递归调用solveNQueensHelper方法处理下一行。

  6. 递归调用会逐行进行,直到找到所有的解。

  7. 最后,我们返回最终结果列表result

  8. solveNQueensHelper方法之外,我们还定义了一个辅助方法generateBoard,用于将皇后的位置转换为棋盘形式的字符串列表。

  9. generateBoard方法遍历queens数组中的每个位置,将每一行转换为一个字符数组,并使用'.'填充所有位置。

  10. 在皇后的位置上,我们将字符数组中的对应位置修改为'Q',表示皇后的位置。

  11. 最后,我们将每一行的字符数组转换为字符串,并将其添加到结果列表board中。

  12. 最后,我们返回结果列表board

这就是N皇后问题的Java代码实现及其详细解析。这个算法使用回溯法来逐行尝试放置皇后,并使用有效性检查来确保皇后之间没有冲突。通过递归调用和回溯,算法能够找到所有的解,并将它们转换为棋盘形式的字符串列表。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值