为了账号安全,请及时绑定邮箱和手机立即绑定

陷入数独作业的回溯步骤

陷入数独作业的回溯步骤

月关宝盒 2023-12-21 10:41:31
我对java很陌生(特别是回溯),我做了一个递归数独求解器几乎两天但没有成功。我认为我的回溯步骤是错误的,但我真的不知道如何修复它。输入是包含数字和字符“.”的 .txt。代表程序需要实现的地方。(ps:Std.In是我老师教科书给出的一个库,它读取.txt并帮助将其转换为semiboard数组)。我知道问题不在于回溯(检查数字是否已根据数独规则分配的回溯)和相关函数。StdIn 库可以在以下网站下载: https: //introcs.cs.princeton.edu/java/stdlib/我收到一个空输出,没有异常消息。这是.txt:. . . . 6 . . . 5 6 2 4 . . . . 1 . . . 1 . . . 3 . . . . . . . 4 . 3 7 . . . 1 . . 5 . . . . 7 5 . . . 9 . . 8 2 4 7 . . . . . 9 . 3 1 . . . . . . . . 2 9 . 5 3 StdIn.readString 在以下链接中定义: https://introcs.cs.princeton.edu/java/stdlib/StdIn.java.html
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

你从未达到条件为cell == 81真的状态。我没有进行调试来确切说明原因是什么。


基本上是你的backtrack方法有问题。现在的样子是这样的:


    private static boolean backtrack(int[] board, int cell, int value) {

    int line = cell / 9;

    //check line

    for (int i = 0; i < 9; i++) {

        if ((board[line * 9 + i] == value)) {

            return true;

        }

    }


    int column = cell % 9;

    //check column

    for (int i = 0; i < 9; i++) {

        if (board[column + i * 9] == value) {

            return true;

        }

    }


    int squareLine = line - (line % 3);

    int squareColumn = column - (column % 3);

    //check square

    for (int i = 0; i < 3; i++) {

        for (int j = 0; j < 3; j++) {

            if (board[(squareLine + i) * 9 + (squareColumn + j)] == value) {

                return true;

            }

        }

    }


    return false;

}


查看完整回答
反对 回复 2023-12-21
  • 1 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信