Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2009-04-11, 22:21   #1
yfl
高级会员
 
yfl 的头像
 
注册日期: 2009-04-11
年龄: 38
帖子: 138
声望力: 19
yfl 正向着好的方向发展
默认 用matlab解数独的程序

求一个用matlab解数独的程序,谢谢!!!
yfl 当前离线   回复时引用此帖
旧 2009-04-12, 16:23   #2
yfl
高级会员
 
yfl 的头像
 
注册日期: 2009-04-11
年龄: 38
帖子: 138
声望力: 19
yfl 正向着好的方向发展
默认 回复: 数独

还是要自己想办法啊,本人写了一个,有兴趣的可以参考一下,以验证过,绝对正确
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
yfl 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码



所有时间均为北京时间。现在的时间是 21:01


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.