【#第一文档网# 导语】以下是®第一文档网的小编为您整理的《简单的数独游戏求解程序(matlab)》,欢迎阅读!
function S=sudoku(A) %SUSOKU0 功能:求解数独 %调用格式:S=sudoku(A) %A--需判断的数独矩阵(9×9),空格用0替代 %S--数独的解 %A=xlsread('sudoku.xls','A11:I19'); k=1; s=1; A1=cell(9); C=cell(9); n0=0 %n0>2 A_ti=A;%原始题目 while 1 [d,p]=find_variable(A); C{p(1),p(2)}=d; n=length(d); if n>n0 n0=n end if n>1 k1(s)=9*(p(2)-1)+p(1); s=s+1; A1{p(1),p(2)}=A; elseif n==0 s=s-1; if A(k1(s))==C{k1(s)}(end) s=s-1; end k=k1(s);%break A=A1{k}; A(k)=C{k}(2);%目前为止没有超过2个可选元素的 continue end A(p(1),p(2))=C{p(1),p(2)}(1); k=k+1; if sum(sum(ceil(A/9)))==81%判断是否填完了 break end %if sum(sum(ceil(A/9)))==81 % break %end end S=A %A=xlswrite('sudoku.xls',S,'k11:S19'); function [D,P]=find_variable(A) %Find_variable 功能:找出数独矩阵中可填值最少的位置及可填值 %调用格式:[D,P]=find_variable(A) %S--需判断的数独矩阵(9×9),空处用0替代 %D--可填的值 %P--可填值最少的位置,P中第1个元素为所在行,第2个元素为所在列 global C D=[1:9]; for k1=1:9 for k2=1:9 if A(k1,k2)~=0 %跳过已给数值 continue else n1=ceil(k1/3); n2=ceil(k2/3); m=A(3*n1-2:3*n1,3*n2-2:3*n2); a=A(k1,:); %行 b=A(:,k2)'; %列 c=reshape(m',1,9); %宫 d0=setdiff(1:9,union(union(a,b),c)); %行列宫并集的补集,即可填数 if length(d0) %选出元素最少的 D=d0;P=[k1,k2]; %返回元素值及位置 end end end end
本文来源:https://www.dywdw.cn/028d7996dd88d0d233d46a6d.html