我正在开发一个函数,以递归方式生成给定数独难题的解决方案,该数独难题由 9x9 数组表示,NaN 表示利用回溯的空格。
function cellSolutions = solveSudoku(PuzzleA)
cellSolutions = {};
if ~reject(PuzzleA)
if accept(PuzzleA)
disp('solution found')
cellSolutions{end+1} = PuzzleA;
end
[nP, Idx] = firstChild(PuzzleA);
while (~isempty(nP))
possibleSolution = solveSudoku(nP);
if (~isempty(possibleSolution))
cellSolutions{end+1} = possibleSolution{1};
end
nP = nextChild(nP,Idx);
end
end
end
返回的 cellSolutions 是一个元胞数组,其中包含 0、1 或更多解,具体取决于存在的解。我遇到的问题实际上是在初始调用返回的 cellSolution 中找到的解决方案。我希望的是:
cellSolutions
{[9x9 double] [9x9 double]} or {} or {[9x9 double]}
我确实可以确认通过 disp 调用找到了一个或多个解决方案,但我不确定如何操作单元阵列。我很确定问题出在:
while (~isempty(nP))
possibleSolution = solveSudoku(nP);
if (~isempty(possibleSolution))
cellSolutions{end+1} = possibleSolution{1};
end
nP = nextChild(nP,Idx);
end
其他一些信息:reject 判断当前谜题是否满足数独规则;接受额外检查以确保没有空格;firstChild 在给定的数独谜题中找到 NaN 的实例,并将其更改为 1 并返回它更改的线性索引和新的谜题;nextChild 需要一个数独谜题和索引,如果该索引处的值不是 9,那么它会增加该值并返回新的谜题。谢谢!