繁体   English   中英

递归回溯数独求解器

[英]Recursive backtracking Sudoku solver

我目前正在学习C ,主要是来自Euler项目的示例。 (<-如果您还不知道,请检查一下!)

根据互联网上的一些资源和一些自行编写的代码,我制作了一个可以解决50个Sudokus的C程序。 我定义了一个数组,如[数独数] [行] [列]。 以下是求解函数。

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,此函数正确。

如果有人来看看,将不胜感激。

首先,我认为功能签名需要固定。 他们应该选一个董事会,而不是董事会清单。 在求解函数之外的列表上进行迭代(实际上,无需将所有电路板都加载到内存中,您只需要对由(0,0)(0,1),(0,2)位置形成的数字求和从所有董事会)
void solve(int board[][], int row, int col) ->尝试从board [row] [col]开始求解
bool is_valid(int board[][], int row, int col, int d) ->是否可以用d填充board [row] [col]

第二,边界条件似乎不正确。 假设row&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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM