数独求解器为无法解决的数独搜索找到解决方案

时间:2013-03-20 23:54:06

标签: c++ algorithm recursion

我已经编写了一个数独求解器,当数据可以解决时它可以正常工作。但是当数据无法解析时,它会在回溯时更改拼图的原始数字。

bool Sudoku::solve(int row, int col){
if (board[row][col] != 0){
    int next_col = col;
    int next_row = row;

    next_col++;

    if (next_col > 8){
        next_row++;
        next_col = 0;
    }

    if (next_row > 8){
        return true;
    } else {
        if (solve(next_row, next_col))
            return true;
    }
}

for (int number = 1; number <= 9; number++){
    board[row][col] = number;

    if (check_row(row, number)
     && check_col(col, number)
     && check_box(row, col, number)){
        int next_row = row;
        int next_col = col+1;

        if (next_col > 8){
            next_col = 0;
            next_row++;
        }

        if (next_row > 8){
            return true;
        }

        if (solve(next_row, next_col))
            return true;
     }
}

board[row][col] = 0;
return false;

}

board是一个2D int数组。我知道我可以使用某种结构而不是整数,如果数字本来就存在,它会存储,但是这个解决方案对我来说并不是很吸引人。还有其他办法吗?

2 个答案:

答案 0 :(得分:2)

在开头的检查中,设置单元格时,

if (board[row][col] != 0){
    int next_col = col;
    int next_row = row;

    next_col++;

    if (next_col > 8){
        next_row++;
        next_col = 0;
    }

    if (next_row > 8){
        return true;
    } else {
        if (solve(next_row, next_col))
            return true;
    }
}

添加

else {
    return false;
}

或将最后一个更改为

return solve(next_row, next_col);

避免更改给定的数字。如果拼图无法解决 - 即使在错误地猜测前一个单元格可以解决原始单元之后 - 它仍然很乐意继续更改单元格中的数字。

答案 1 :(得分:0)

您可以创建一组所有访问过的位置。

示例实现是创建包含已访问过的每个位置的std::set<pair<int, int> > visited。然后,如果访问过该位置,请不要更改该值。