请求对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
生成步骤:
- 初始调用
Queens(b, 0)(处理第0行):- 先执行循环
j=0:给第0行第0列放Q,递归处理第1行,生成前两种输出后,回溯把第0行第0列改回x。
- 先执行循环
- 回到第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行的循环。
- 进入第1行的循环,先执行
- 给第0行第1列放
第四种输出:
x Q x Q
生成步骤:
- 接上面的流程,在第1行的循环中,处理完
j=0后,执行j=1:- 给第1行第1列放
Q,此时棋盘第1行变为x Q。 - 递归调用
Queens(b, 2),row=2等于棋盘长度,触发打印,得到第四种输出。
- 给第1行第1列放
- 回溯:把第1行第1列改回
x,回到第0行的循环,把第0行第1列改回x,整个流程结束。
简单来说,这段代码的逻辑就是逐行尝试每一列放皇后,递归到最后一行就打印当前棋盘,然后回溯撤销当前列的皇后,继续尝试下一列,所以会遍历所有可能的摆放组合。
内容的提问来源于stack exchange,提问作者Astitva Shukla
相关产品推荐
相关产品推荐

