F =[NaN 2 NaN NaN 3 NaN NaN 4 NaN; 6 NaN NaN NaN NaN NaN NaN NaN 3; NaN NaN 4 NaN NaN NaN 5 NaN NaN; NaN NaN NaN 8 NaN 6 NaN NaN NaN; 8 NaN NaN NaN 1 NaN NaN NaN 6; NaN NaN NaN 7 NaN 5 NaN NaN NaN; NaN NaN 7 NaN NaN NaN 6 NaN NaN; 4 NaN NaN NaN NaN NaN NaN NaN 8; NaN 3 NaN NaN 4 NaN NaN 2 NaN];
functionsudoku_solve(matrix,id) if id>81 disp(matrix); return; else row = floor((id-1)/9)+1; col = mod((id-1),9)+1; gong = matrix(3*floor((row-1)/3)+1:3*floor((row-1)/3)+3, 3*floor((col-1)/3)+1:3*floor((col-1)/3)+3); if ~isnan(matrix(row,col)) sudoku_solve(matrix,id+1); else for num = 1:9 if (~ismember(num,matrix(row, :))) ... && (~ismember(num,matrix(:, col)')) ... && (~ismember(num,gong(:)')) matrix(row,col) = num; sudoku_solve(matrix,id +1); end end end end end
这里的代码就是朋友参考的B站的解法,在我电脑上求解原数独问题大致需要10s。但是它有一个bug:求解出来的数独的第一格填的数字是9,于是我们面向结果编程,将for循环改为for num = 9:-1:1,发现确实能很快输出正确结果,但是程序在输出结果后还会接续运行,最终实际运行时间与改之前无异。
functionresult = sudoku_solve(matrix,id) if id>81 result = matrix; return; else row = floor((id-1)/9)+1; col = mod((id-1),9)+1; gong = matrix(3*floor((row-1)/3)+1:3*floor((row-1)/3)+3, 3*floor((col-1)/3)+1:3*floor((col-1)/3)+3); if ~isnan(matrix(row,col)) result = sudoku_solve(matrix,id+1); else for num = 1:9 if (~ismember(num,matrix(row, :))) ... && (~ismember(num,matrix(:, col)')) ... && (~ismember(num,gong(:)')) matrix(row,col) = num; result = sudoku_solve(matrix,id +1); end end end end end