java - 蛮力数独算法

标签 java algorithm sudoku brute-force backtracking

<分区>

Possible Duplicate:
Sudoku algorithm, brute force

几天来我一直在尝试编写一个强力算法来解决数独问题,我的问题是我从来没有真正让算法 100% 工作,有人可以指导我并提供一些帮助吗?

算法位于 Square 类中,递归函数。

public abstract class Square {

private Square next;

private Box box;
private Row row;
private Columne columne;

private int value;

Square(int value, Box box, Row row, Columne columne) {
    this.value = value;
    this.box = box;
    this.row = row;
    this.columne = columne;
}

void setNumberMeAndTheRest(Board board) {
    if(getNext() == null) {
        System.out.println("next == null");
        for(int i = 1; i <= board.getDimension(); i++) {
            if(legalValue(i)) {
                setValue(i);
            }
        }
        board.saveSolution();
        return;
    } else {
        if(this instanceof DefinedSquare) {
            getNext().setNumberMeAndTheRest(board);

        } else {
            for(int i = 1; i <= board.getDimension(); i++) {
                if(legalValue(i)) {
                    setValue(i);
                    getNext().setNumberMeAndTheRest(board);
                }
            }
            return;
        }
    }
}

int getValue() {
    return value;
}

void setValue(int value) {
    this.value = value;
}

void setNext(Square next) {
    this.next = next;
}

public Square getNext() {
    return next;
}

/**
 * Checks if value is legal in box, row and column.
 * @param value to check.
 * @return true if value is legal, else false.
 */
boolean legalValue(int value) {
    if(box.legalValue(value) && row.legalValue(value) && columne.legalValue(value)) {
        return true;
    }
    return false;
}

最佳答案

我想你的问题可能出在这里

    for(int i = 1; i <= board.getDimension(); i++) {
        if(legalValue(i)) {
            setValue(i);
            getNext().setNumberMeAndTheRest(board);
        }
    }

如果 legalValue(i) 返回 true independent 当前 i 的状态,那么你正在回溯,如果不是,你就没有回溯

大多数回溯看起来像 htis 一样 osmething

    for(int i = 1; i <= board.getDimension(); i++) {
        if(legalValue(i)) {
            setValue(i);
                // boolean indicating whether solution was found
            if(getNext().setNumberMeAndTheRest(board))
               return true;
            else
               unsetValue(i)
        }
    }

我们需要更多的代码来了解 legalValue 是否在 square i 已经设置时返回 false

试试这个看看我是否在正确的轨道上或发布所有你的代码

    System.out.println("STARTING ITERATION")
    for(int i = 1; i <= board.getDimension(); i++) {

        if(legalValue(i)) {
            System.out.println("GOING " + i)
            setValue(i);
            getNext().setNumberMeAndTheRest(board);
        }
    }
    System.out.println("ENDING ITERATION")

如果它填满网格然后停止而不回溯,你的问题是你调用 setValue(i) 然后调用 legalValue(i+1) 并且它返回 false 因为该值已经设置,而不是因为这是不合法的。如果是这样,您需要在 reucrsion 之后进行等效的“取消设置”

关于java - 蛮力数独算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10193330/

相关文章:

algorithm - 动态规划方法是否需要这两个条件(最优结构和重叠子问题)?

java - 在 Java 中创建数独

Python - 简化数独求解器代码

c++ - 一个数字只出现一次?

Java——使用线程来启动——暂停——停止一个微型编程世界

java - 为什么 nsIScriptableInputStream 不工作?

java - 从字符串 java/gwt 中解析 htmltags

algorithm - CodeFight first重复面试挑战

python - 模糊分组,相似词分组

java - 在 UCanAccess 中通过 DDL 创建的表无法在 Access 本身中打开