还是要自己想办法啊,本人写了一个,有兴趣的可以参考一下,以验证过,绝对正确:)
function B=shudu(A)
%计算数独的程序。
%0表示待填的空格
%例子
%A=[2 0 0 0 9 0 0 0 7;
% 0 0 0 0 6 3 0 0 9;
% 0 0 9 1 0 5 0 0 0;
% 3 0 8 0 0 6 2 0 1;
% 0 0 1 0 0 0 3 0 0;
% 7 0 5 3 0 0 4 0 8;
% 0 0 0 6 0 9 5 0 0;
% 1 0 0 2 4 0 0 0 0;
% 6 0 0 0 3 0 0 0 4];
%shudu(A)
%ans =
% 2 3 6 8 9 4 1 5 7
% 5 1 4 7 6 3 8 2 9
% 8 7 9 1 2 5 6 4 3
% 3 4 8 9 5 6 2 7 1
% 9 2 1 4 8 7 3 6 5
% 7 6 5 3 1 2 4 9 8
% 4 8 3 6 7 9 5 1 2
% 1 5 7 2 4 8 9 3 6
% 6 9 2 5 3 1 7 8 4
%如果出现超过RecursionLimit最大限制的情况,请适当增加RecursionLimit的阈值
%方法是set(0,'RecursionLimit',N),N就是新设的值。
[a,b]=find(A==0,1);%找0,只要一个就可以了。
if isempty(a)%如果没有0,就说明填满了,这就是答案。
B=A;
else%如果有0,就列出第一个0的所有可能取值。
I=[];
t=1:9;
for j=1:9
if A(a,j)~=0
t(A(a,j))=0;
end
if A(j,b)~=0
t(A(j,b))=0;
end
end
for j=(ceil(a/3)*3-2):(ceil(a/3)*3)
for k=(ceil(b/3)*3-2):(ceil(b/3)*3)
if A(j,k)~=0
t(A(j,k))=0;
end
end
end
I=find(t~=0);
if isempty(I)%如果没有可能项,说明矛盾。
B=[];
else%否则将可能项一个个代入,递归。
for j=1:length(I)
C=A;C(a,b)=I(j);
B=shudu(C);
if ~isempty(B);
return;
end
end
end
end
vBulletin® v3.8.3,版权所有 ©2000-2025,Jelsoft Enterprises Ltd.