Java实现Boggle单词校验器递归返回值异常问题求助
现有代码的核心逻辑缺陷
- 递归返回值未传递:所有内部递归调用
check()的位置都没有承接返回结果,哪怕深层递归已经命中单词最后一个字符返回true,这个结果也不会逐层向上抛,最终执行流走到函数末尾统一返回false,这是走到最后一个字母也得不到正确结果的直接原因。 - 方向判断逻辑错误:相邻方向检查全部用
else if串联,导致只要前一个方向的坐标合法,不管对应字符是否匹配,都会直接跳过后续所有方向的检查。比如当前位置上方坐标合法,哪怕上方的字符和目标单词不匹配,也不会再检查右侧、下方、其余对角方向的相邻格子,完全不符合8邻域遍历的要求。 - 缺失访问状态标记:没有实现Boggle规则要求的“不可重复使用单元格”逻辑,遇到带重复字母的目标单词时,会出现走回头路、重复占用已遍历格子的错误。
- 起点遍历逻辑错误:碰到第一个和目标单词首字母匹配的格子就直接返回递归结果,完全不考虑该起点无法拼成单词、但其他同首字母起点可以拼成单词的情况。
逻辑优化方向
- 用偏移量数组统一替代8段重复的方向判断代码:把8个相邻方向的行、列偏移量存在二维数组里,循环遍历所有方向,去掉原先的
else if串联结构,每个方向独立做坐标合法性、字符匹配判断。 - 实现回溯式访问标记:每进入一个待检查的格子,先临时把格子内容改成不会和字母冲突的标记(比如
#)防止重复访问,等所有相邻方向遍历完成后,再把格子内容恢复原值,不影响后续其他路径的检查。 - 正确传递递归结果:只要任意一个方向的递归调用返回
true,就立刻逐层向上返回true,不再继续检查其他方向;如果所有方向遍历完都没有匹配路径,就返回false。 - 修正终止条件判断:把递归终止逻辑放在函数最开头,只要当前匹配的索引等于目标单词长度,就直接返回
true,避免索引偏移导致的判断时机错误。
核心修正代码片段
// 8个相邻方向的偏移量 private static final int[][] DIRECTIONS = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1} }; public boolean checkit() { char[] charArr = word.toCharArray(); for(int row=0; row< board.length; row++) { for(int col=0; col<board[0].length; col++) { if(board[row][col] == charArr[0]) { // 只要某个起点能拼成功,直接返回true if(check(board, charArr, row, col, 0)) { return true; } } } } // 所有起点都走不通,返回false return false; } public boolean check(char[][] board, char[] charArr, int row, int col, int index) { // 终止条件:索引走完整个单词,匹配成功 if (index == charArr.length) return true; // 越界、字符不匹配、已经访问过的情况,直接返回失败 if (row < 0 || row >= board.length || col <0 || col >= board[0].length || board[row][col] != charArr[index]) return false; // 标记当前格子为已访问 char temp = board[row][col]; board[row][col] = '#'; // 遍历所有相邻方向 for (int[] dir : DIRECTIONS) { if (check(board, charArr, row + dir[0], col + dir[1], index + 1)) { return true; } } // 回溯:恢复格子原值 board[row][col] = temp; return false; }
内容的提问来源于stack exchange,提问作者bubbleghost
相关产品推荐
相关产品推荐

