【发布时间】:2020-05-27 09:53:52
【问题描述】:
我编写了一个 MATLAB 程序,该程序使用递归回溯解决方案解决了 9 x 9 数独难题,但递归似乎没有终止。当我暂停调试器并查看电路板时,我发现我的电路板已经包含正确的解决方案。在我的方法中,我逐列处理板元素,从 (1, 1) 中的元素 1 开始,到 (9, 9) 中的元素 81 结束。 checkSudoku 通过查看行、列和 3x3 子网格来检查数字是否是有效的位置。 h 是递归发生的地方。任何人都可以就我的代码出错的地方提供建议吗?
function result = h(board, num)
if num >= 82
result = board;
else
if isnan(board(num))
flag = false;
c = ceil(num / 9);
r = num - ((c - 1) * 9);
n = 1;
while (n <= 9) & (~flag)
if checkSudoku(board, r, c, n)
board(num) = n;
product = h(board, num + 1);
if ~isnan(product)
flag = true;
board(num) = n;
else
board(num) = NaN;
n = n + 1;
end
else
n = n + 1;
end
end
if ~flag
result = NaN;
else
result = h(board, num + 1);
end
else
result = h(board, num + 1);
end
end
end
function safe = checkSudoku(board, row, col, num)
r = row;
c = col;
subrow = board(r, :);
subcol = board(:, col);
subBoard = zeros(3, 3);
if any([1 2 3] == r)
if any([1 2 3] == c)
subBoard = board(1:3, 1:3);
elseif any([4 5 6] == c)
subBoard = board(1:3, 4:6);
else
subBoard = board(1:3, 7:9);
end
elseif any([4 5 6] == r)
if any([1 2 3] == c)
subBoard = board(4:6, 1:3);
elseif any([4 5 6] == c)
subBoard = board(4:6, 4:6);
else
subBoard = board(4:6, 7:9);
end
else
if any([1 2 3] == c)
subBoard = board(7:9, 1:3);
elseif any([4 5 6] == c)
subBoard = board(7:9, 4:6);
else
subBoard = board(7:9, 7:9);
end
end
if any(subrow == num)
safe = false;
elseif any(subcol == num)
safe = false;
elseif any(any(subBoard == num))
safe = false;
else
safe = true;
end
end
function solvedBoard = solveSudoku(board)
solvedBoard = h(board, 1);
end
我从 MITOpenCourseWare,作业 3 可选问题 3 中拿了题目和 MATLAB 文件。文件和照片可以在here找到。
【问题讨论】:
-
board变量是什么样的? -
您好,该板是 9 x 9 矩阵。我从 MITOpenCourseWare,作业 3 可选问题 3 中获取了问题和 MATLAB 文件。文件和照片可以在此链接中找到 ocw.mit.edu/courses/electrical-engineering-and-computer-science/…
-
无法附加图片,因为没有足够的信誉点:p
-
这是因为即使板子完成了,你也不会检查它或有一个标志来表示它,所以递归永远不会停止。应始终编写递归例程以实现平滑返回。如果您需要返回一个
FoundIt标志来告诉调用例程返回,那么就这样做。 -
Matlab 的新手,所以我不太确定 return 关键字的使用方式,但这是否意味着我应该在最顶部添加一条 if 语句来检查整个板子是否已填满,有效(终止条件),如果是,写'return'关键字?我要终止的基本情况实际上是(如果 num >= 82),但它似乎没有正确终止。