Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#2 |
高级会员
注册日期: 2009-04-11
年龄: 38
帖子: 138
声望力: 19 ![]() |
![]()
还是要自己想办法啊,本人写了一个,有兴趣的可以参考一下,以验证过,绝对正确
![]() 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) ![]() for k=(ceil(b/3)*3-2) ![]() 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 |
![]() |
![]() |