如何将Java中返回boolean的数独求解方法改写为void类型?
数独求解方法从boolean改为void的改写方案
核心问题分析
原boolean类型方法的返回值作用是向上层递归传递「当前路径是否找到合法解」的信号,你之前的改写版本里okay变量的判断时机和赋值逻辑完全颠倒,才会导致回溯失效或者提前终止。
正确实现思路
用类成员变量标记是否已经找到解,一旦找到就终止所有递归路径,不需要再尝试其他数字,以此模拟原boolean返回值的传递效果。
代码实现
首先定义类成员变量存储求解状态:
// 类成员变量,标记是否找到有效解,初始为false private boolean found = false;
改写后的void方法如下:
void solveSudoku() { // 已经找到解的话直接终止当前递归分支 if (found) { return; } int[] arr = findEmptySquare(); // 没有空白格子,说明找到合法解 if (arr == null) { found = true; return; } // 给全局row、col赋值,你之前的代码漏了这步 row = arr[0]; col = arr[1]; // 遍历尝试1-9的数字 for (int i = 1; i <= 9; i++) { // 已经找到解就不需要再试后续数字 if (found) { break; } if (!givesConflict(row, col, i)) { grid[row][col] = i; // 递归求解下一个空白格 solveSudoku(); // 递归返回后如果已经找到解,直接返回不需要回溯 if (found) { return; } // 没找到解,回溯当前格子 grid[row][col] = 0; } } // 所有数字都试完仍无解,直接返回即可,found保持false }
注意事项
- 每次求解新的数独之前,必须手动把
found重置为false,避免上一次求解的结果影响本次运行 - 如果你的
row、col是方法内局部变量,直接在方法内定义赋值即可,不需要使用全局变量
内容的提问来源于stack exchange,提问作者stackuser25
相关产品推荐
相关产品推荐

