You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求对N皇后问题全解法干运行及回溯代码逻辑讲解

2皇后问题回溯代码干运行解析

先明确:你写的这段代码没有实现皇后冲突检测逻辑,它会枚举所有皇后摆放的可能组合,而非仅合法的N皇后解。针对2x2的棋盘,一共会生成4种组合,就是你提到的四个输出。

你的代码如下:

public static void Queens(char b[][],int row) {
    if(row==b.length){
        print(b);
        return;
    }
    for(int j=0;j<b[0].length;j++){
        b[row][j]='Q';
        Queens(b,row+1);
        b[row][j]='x';
    }
}

// 假设main方法初始化了2x2的空棋盘(初始值为'x')
public static void main(String[] args) {
    char[][] b = new char[2][2];
    for (int i = 0; i < 2; i++) {
        Arrays.fill(b[i], 'x');
    }
    Queens(b, 0);
}

下面一步步模拟回溯过程,解释你困惑的两种输出的生成逻辑:


第三种输出:

x Q
Q x

生成步骤:

  1. 初始调用Queens(b, 0)(处理第0行):
    • 先执行循环j=0:给第0行第0列放Q,递归处理第1行,生成前两种输出后,回溯把第0行第0列改回x。
  2. 回到第0行的循环,执行j=1:
    • 给第0行第1列放Q,此时棋盘第0行变为x Q。
    • 递归调用Queens(b, 1)处理第1行:
      • 进入第1行的循环,先执行j=0:给第1行第0列放Q,此时棋盘第1行变为Q x。
      • 递归调用Queens(b, 2),此时row=2等于棋盘长度(2),触发打印,得到第三种输出。
      • 回溯:把第1行第0列改回x,回到第1行的循环。

第四种输出:

x Q
x Q

生成步骤:

  1. 接上面的流程,在第1行的循环中,处理完j=0后,执行j=1:
    • 给第1行第1列放Q,此时棋盘第1行变为x Q。
    • 递归调用Queens(b, 2),row=2等于棋盘长度,触发打印,得到第四种输出。
  2. 回溯:把第1行第1列改回x,回到第0行的循环,把第0行第1列改回x,整个流程结束。

简单来说,这段代码的逻辑就是逐行尝试每一列放皇后,递归到最后一行就打印当前棋盘,然后回溯撤销当前列的皇后,继续尝试下一列,所以会遍历所有可能的摆放组合。

内容的提问来源于stack exchange,提问作者Astitva Shukla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:52:42