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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:18:03