求用matlab编写的数独游戏的界面,9*9,简单的
答案:1 悬赏:20 手机版
解决时间 2021-03-30 14:42
- 提问者网友:城市野鹿
- 2021-03-30 10:19
求用matlab编写的数独游戏的界面,9*9,简单的
最佳答案
- 五星知识达人网友:duile
- 2021-03-30 10:58
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯