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)<length(D) %选出元素最少的
D=d0;P=[k1,k2]; %返回元素值及位置
end
end
end
end。