[英]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==9
和col==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.