バックトラッキングを利用して空白を表す NaN を持つ 9x9 配列で表される特定の数独パズルの解を再帰的に生成する機能に取り組んでいます。
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 呼び出しで 1 つ以上のソリューションが見つかったことを確認できますが、セル配列を操作する方法がわかりません。問題は次の点にあると確信しています。
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 でない場合、値を増やして新しいパズルを返します。ありがとう!