我目前正在学习 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,此函数是正确的。
如果有人想看看,我真的很感激。
答案 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
其次,边界条件似乎不正确。假设行&amp; 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。