八皇后挑战:递归检查棋盘对角线冲突的布尔函数问题
八皇后对角线递归检查问题修复
原代码存在的问题
- 语法错误:递归返回语句末尾多了一个右括号,
diaCheck(r+1, c+1))需改为diaCheck(r+1, c+1) - 逻辑错误:若当前位置
(r,c)是刚放置的皇后(值为1),函数会直接返回false,误判为冲突 - 递归冗余:四个方向同时递归会重复遍历大量位置,且会重复检查同一对角线上的格子
修复后的代码
//pre: r & c within bounds of board //post: returns true if no queens are diagonally challenging public boolean diaCheck(int r, int c){ // 跳过当前放置皇后的位置,只检查四个对角线方向的其他格子 if(board[r][c] == 1) { return checkDiagonal(r-1, c-1, -1, -1) && checkDiagonal(r-1, c+1, -1, 1) && checkDiagonal(r+1, c-1, 1, -1) && checkDiagonal(r+1, c+1, 1, 1); } return false; } // 辅助函数:沿指定方向(dr行增量,dc列增量)检查对角线 private boolean checkDiagonal(int r, int c, int dr, int dc) { // 出界则该方向无冲突 if(r < 0 || r >= board.length || c < 0 || c >= board.length) { return true; } // 遇到皇后则存在冲突 if(board[r][c] == 1) { return false; } // 沿当前方向继续递归检查 return checkDiagonal(r + dr, c + dc, dr, dc); }
修复说明
- 拆分递归逻辑:用辅助函数单独处理每个对角线方向,避免重复遍历,逻辑更清晰
- 排除当前位置:跳过刚放置皇后的位置,只检查四个对角线方向的其他格子,避免误判
- 语法修正:移除多余的右括号,保证代码可编译
- 定向递归:每个辅助函数只沿一个固定方向(如左上:行-1、列-1)递归,直到出界或找到皇后,消除交叉递归的冗余
内容的提问来源于stack exchange,提问作者John McDonald
相关产品推荐
相关产品推荐

