
1个回答
推荐于2017-12-16
展开全部
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
[a,b]=find(A==0);%找0
if isempty(a)%如果没有0,就说明填满了,这就是答案。
B=A;
else%如果有0,就列出每个0的所有可能取值。
for i=1:length(a)
I{i}=[];
t=1:9;
for j=1:9
if A(a(i),j)~=0
t(A(a(i),j))=0;
end
if A(j,b(i))~=0
t(A(j,b(i)))=0;
end
end
for j=(ceil(a(i)/3)*3-2):(ceil(a(i)/3)*3)
for k=(ceil(b(i)/3)*3-2):(ceil(b(i)/3)*3)
if A(j,k)~=0
t(A(j,k))=0;
end
end
end
I{i}=find(t~=0);
if isempty(I{i})%如果没有可能项,说明矛盾。
B=[];return;
end
z(i)=length(I{i});
end
[p,q]=min(z);%从可能取值最少的地方开刀,这样快点
for j=1:p%将可能的值一个个代入,递归
C=A;C(a(q),b(q))=I{q}(j);
B=shudu(C);
if ~isempty(B);
return;
end
end
end
%计算数独的程序。
%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
[a,b]=find(A==0);%找0
if isempty(a)%如果没有0,就说明填满了,这就是答案。
B=A;
else%如果有0,就列出每个0的所有可能取值。
for i=1:length(a)
I{i}=[];
t=1:9;
for j=1:9
if A(a(i),j)~=0
t(A(a(i),j))=0;
end
if A(j,b(i))~=0
t(A(j,b(i)))=0;
end
end
for j=(ceil(a(i)/3)*3-2):(ceil(a(i)/3)*3)
for k=(ceil(b(i)/3)*3-2):(ceil(b(i)/3)*3)
if A(j,k)~=0
t(A(j,k))=0;
end
end
end
I{i}=find(t~=0);
if isempty(I{i})%如果没有可能项,说明矛盾。
B=[];return;
end
z(i)=length(I{i});
end
[p,q]=min(z);%从可能取值最少的地方开刀,这样快点
for j=1:p%将可能的值一个个代入,递归
C=A;C(a(q),b(q))=I{q}(j);
B=shudu(C);
if ~isempty(B);
return;
end
end
end
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询