如何仅通过这种回溯找到第一个解决方案

2023-11-30

我正在尝试编写一个数独求解器,它将仅返回第一个可能的解决方案。 我设法用 void 方法打印所有可能的解决方案,但我不能在第一个发现时停止。

我知道首选方法是切换到布尔方法并返回true上树—— 但我找不到正确的写法。

我尝试的任何方式总是给出编译错误(method must return boolean).

public boolean recursiveSolve(int line, int column) {
    if(line == N) // N is the board size (9)
        return true;
    // if Cell is not empty - continue
    if(board1.getCell(line, column) != 0) { 
        return nextCell(line, column);
    }
    // if Cell empty - solve
    else { 
        for(int i = 1; i <= N; i++) {
            board1.setCell(line, column, i); // set value to cell
            if(board1.boardIsOk())           // check if the board is legal
                return nextCell(line, column); // continue
        }
        board1.setCell(line, column, 0);     // backtrack
    }
}

private boolean nextCell(int line, int column) {
    if(column < 8)
        return recursiveSolve(line, column+1); // progress up the row
    else
        return recursiveSolve(line+1, 0);      // progress down the lines
}

任何帮助将不胜感激。


这是大多数递归回溯问题的一些伪代码。

如果您已经找到解决方案,请报告成功。

for (当前位置的每一个可能的选择) {

做出这个选择并沿着这条路迈出一步。

使用递归从新的位置解决问题。

如果递归调用成功,向上级报告成功 等级。

退出当前选择恢复开始时的状态 循环的。

}

报告失败。

这是一些基于斯坦福大学讲座的实际代码。我用java重写了它并添加了注释。

Boolean SolveSudoku(int[][] grid)
{
    int row, col;

    if(!FindUnassignedLocation(grid, row, col))
        //all locations successfully assigned
        return true;

    for(int num = 1; num <= 9; num++)
    {
        //if number is allowed to be placed in the square
        if(NoConflicts(grid, row, col, num))
        {
            //place the number in the square
            grid[row][col] = num;

            //recur, if successful then stop
            if(SolveSudoku(grid))
                return true;

            //undo and try again
            grid[row][col] = UNASSIGNED;
        }
     }
     //this triggers backtracking from early decisions
     return false;
}

您只需要实现一些非常简单的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅通过这种回溯找到第一个解决方案 的相关文章

随机推荐

  • sphinx 自动摘要:“无法导入 Child.model”(继承的实例属性)

    我在使用 sphinx 和自动摘要时遇到问题 显然 sphinx 无法记录继承的实例属性 由于某种原因 产生的错误是导入错误 蟒蛇代码 class Base Base class def init self kwargs Init self
  • 当机器人加入服务器时发送消息

    我想每次当机器人被邀请到服务器时发送一条消息 然后它应该写这样的内容 你好 这是我的不和谐机器人 到目前为止 我有这段代码 它不会产生任何错误 但也不会发送消息 bot event async def on server join ctx
  • 是否可以解决“为可变参数参数创建 T 的通用数组”编译器警告?

    这是相关代码的简化版本 一个泛型类使用另一个具有泛型类型参数的类 并且需要将泛型类型之一传递给具有可变参数参数的方法 class Assembler
  • Microsoft BotFramework-WebChat 滚动问题

    我正在使用微软 BotFramework WebChat 但我在让它正确滚动时遇到问题 通常 当机器人响应时 用户被迫手动滚动到聊天日志的底部 我找不到任何有关挂钩的文档 可以让我调用 API 来滚动它 有没有办法让聊天窗口自动滚动 HTM
  • C++ 中 int 的 ostringstream 问题

    我希望输出以下代码hello5 相反 它只输出hello 尝试将 int 输出到 似乎是一个问题ostringstream 当我直接输出相同的内容时cout我收到了预期的输入 在 Snow Leopard 上使用 XCode 3 2 Tha
  • 带复选框的 Javafx 8 Tableview 选择

    我已经设置了一个启用多选的表视图 并尝试将插入列中的复选框的侦听器附加到表的选择模型 checkBoxTableColumn setCellValueFactory cellData gt CheckBox checkBox new Che
  • java.lang.IndexOutOfBoundsException

    我使用 ArrayList 来存储关卡中每个矩形的 阴影 但是当我像这样迭代时 for int n 0 n lt shadows size n g2d fillPolygon shadows get n 0 g2d fillPolygon
  • SpeechToText 并运行 ACTION_CHECK_TTS_DATA 意图

    我已经实施了TextToSpeech完全按照中提到的集成这篇博文 在我将它添加到我的程序中后 它现在干扰了我的其他程序intents 例如 项目清单 用户启动应用程序 用户调用加载活动 用户选择要加载的文件 活动返回 fileanme 以在
  • Kubernetes 不将数据复制到已安装的卷中

    根据这里的文档 https docs docker com storage volumes 如果您启动一个创建新卷的容器 如上所述 并且该容器在要挂载的目录 例如上面的 app 中具有文件或目录 则该目录的内容将被复制到该卷中 然后容器安装
  • 在 PYTHON 中向文件添加时间戳

    我可以使用 os rename 重命名文件 没有任何问题 错误 但是当我尝试重命名一个文件并添加时间戳时 它会抛出 win3 错误或 win123 错误 尝试了所有组合但没有运气 任何人都可以帮忙 成功运行代码 usr bin python
  • 通过 Java 与 Apple 推送通知服务器进行 SSL 握手

    您好 我正在尝试使用 Java 向我的设备发送推送消息 但我在建立 ssl 连接时已经遇到问题了 这是到目前为止的代码 KeyStore keyStore KeyStore getInstance PKCS12 InputStream ke
  • 如何在CSS中获取背景图像上的扫描线

    我有一个整页背景图像 我想在其上覆盖扫描线 我想复制我在二十世纪九十年代的数字艺术中看到的更传统的对角线扫描线效果 例如实现here在 Bootstrap 的模式掩码 5 中 我看过一些关于对角线扫描线的教程 但一直找不到这样的东西 我将如
  • 注册自定义控件失败

    我尝试在 webconfig 文件中注册我的用户控件 因为我收到 元素不存在 错误 但当我尝试在 webconfig 中注册它们时 我收到以下错误 Invalid or missing attributes found in the tag
  • 如何在displaytag中导出带有xlsx扩展名的excel文件

    We used 显示标签用于导出文件xls格式 但我想要它xlsx格式 有什么办法可以将excel文件转换为新格式吗 我将显示标签中的扩展名更改为xls 到 xlsx
  • 使用 jQuery 和 PHP 实现长轮询

    我想构建一个基于 JavaScript jQuery 将用于 AJAX 和 PHP 的聊天 我听说这样做的一个好方法是使用长轮询 我确实理解这个想法 但我不知道如何在服务器端实现它 无限循环听起来是个坏主意 您不想创建无限循环 但可以设置超
  • 可滚动 div 无法在 Android 模拟器、iPhone 模拟器中工作

    我正在使用phonegap 我想保留固定的页眉和页脚 并且我想在它们之间滚动内容 为此 我将 div 与 div width 249px height 299px background color Gray overflow y auto
  • 如何使用宏在 SAS 中获取当前月份名称和年份

    我正在 SAS 中触发一封邮件 该邮件应在邮件中保存当前月份和年份 如何创建宏变量 month year这样 month应显示十月 year应显示 2020 目前使用 let sysmonth sysfunc month sysdate d
  • SqlDataSourceEnumerator.Instance.GetDataSources() 找不到本地 SQL Server 2008 实例

    我使用以下代码列出所有远程和本地 SQL Server 实例 public static void LocateSqlInstances using DataTable sqlSources SqlDataSourceEnumerator
  • 如何使用新的 OpenSSL 库编译 PHP

    我正在尝试使用 OpenSSL 编译 PHP 只需配置即可与默认 OpenSSL 库 0 9 6 配合使用 with openssl usr 但是 我安装了一个新的 OpenSSL 库 1 0 0 我想用它来编译 PHP 这个图书馆位于 u
  • 如何仅通过这种回溯找到第一个解决方案

    我正在尝试编写一个数独求解器 它将仅返回第一个可能的解决方案 我设法用 void 方法打印所有可能的解决方案 但我不能在第一个发现时停止 我知道首选方法是切换到布尔方法并返回true上树 但我找不到正确的写法 我尝试的任何方式总是给出编译错