递归回溯数独求解器

时间:2017-07-12 09:34:56

标签: c recursion backtracking sudoku

我目前正在学习 C ,主要是来自Project Euler的示例。 (< - 如果你不熟悉它,请查看它!)

在互联网上的一些消息来源和一些自编代码中,我制作了一个 C 程序,该程序应解决50个Sudokus。我已经定义了一个像[数独的数] [行] [列]这样的数组。以下是解决功能。

int solve(int puzzles[50][9][9], int sudokuNumber, int row, int col){
int nextNum = 1;

if (row == 8){
    return 1;
}

if (puzzles[sudokuNumber][row][col]){
    if (col == 8){
        if (solve(puzzles, sudokuNumber, row+1, 0))
            return 1;
    }
    else {
        if (solve(puzzles, sudokuNumber, row, col+1))
            return 1;
    }
    return 0;
}

for (; nextNum <= 9; nextNum++){
    if (isValid(sudokuNumber, row, col, nextNum)){
        puzzles[sudokuNumber][row][col] = nextNum;
        if (col == 8){
            if (solve(puzzles, sudokuNumber, row+1, 0))
                return 1;
        }
        else {
            if (solve(puzzles, sudokuNumber, row, col+1))
                return 1;
        }
    }
}
}

遗憾的是,在这一点上并没有真正输出任何内容而且非常令人沮丧......我是否犯了明显的愚蠢错误? isValid如果有效则返回1,此函数是正确的。

如果有人想看看,我真的很感激。

1 个答案:

答案 0 :(得分:0)

首先,我认为功能签名需要修复。他们应该拿一块板而不是一块板。迭代求解函数之外的列表(实际上不需要将所有板加载到内存中,只需要将(0,0)(0,1),(0,2)位置形成的数字相加来自所有董事会)
void solve(int board[][], int row, int col) - &GT;尝试从Board [row] [col]开始解决 bool is_valid(int board[][], int row, int col, int d) - &gt;是否可以用d

填充[row] [col]

其次,边界条件似乎不正确。假设行&amp; col取0到8的值,它应该是row==9col==9而不是8。

另外,我认为你必须跳过已填充的细胞。 if(board[row][col] != 0) solve(board, row, col+1)

此外,根据is_valid的实施方式,您必须确保正确填写。在该问题中,未填充的行表示为0。因此,在您无法用1到9之间的所有数字填充board [row] [col]之前回溯之前,请务必将board [row] [col]设置回0。