用matlab解数独游戏,现在找到了一个程序,但是看不懂,有没有大神帮忙讲解下,谢谢!!!
一共有6个小的m文件,先后顺序不知道。会追加财富值的,求帮忙!function[i,j,P]=findmp(A)temp=zeros(9,9);temp(A>0)=10;...
一共有6个小的m文件,先后顺序不知道。会追加财富值的,求帮忙!
function [i,j,P]=findmp(A)
temp=zeros(9,9);
temp(A>0)=10;
for row=1:9
for col=1:9
if A(row,col)==0
r=A(row,:); r=r(r>0);
c=A(:,col); c=c(c>0);
rc1=and_log(r,c);%行列不同元素放在rc中
rr=findrc(row);
cc=findrc(col);
rc2=reshape(A(rr*3+1:rr*3+3,cc*3+1:cc*3+3),1,9);
rc2=rc2(rc2>0);
total=and_log(rc1,rc2);
temp(row,col)=9-length(total);
end
end
end
[v,i]=min(temp);
[v,j]=min(v);
i=i(j);
row=i;
col=j; %以下找出可能元素
r=A(row,:); r=r(r>0);
c=A(:,col); c=c(c>0);
rc1=and_log(r,c);
rr=findrc(row);
cc=findrc(col);
rc2=reshape(A(rr*3+1:rr*3+3,cc*3+1:cc*3+3),1,9);
rc2=rc2(rc2>0);
total=and_log(rc1,rc2);
P=[];
for kkk=9:-1:1
if isempty(find(total==kkk))==1
P=[P,kkk];
end
end
end
function main(A)
if isempty(find(A==0))==1
save result A
return;
end
[i,j,P]=findmp(A);
if length(P)==0
return;
else
for k=1:length(P)
A(i,j)=P(k);
main(A);
end
end
end
function c=and_log(a,b)
c=a;
for i=1:length(b)
log=0;
for j=1:length(a)
if b(i)==a(j)
log=1;
break;
end
end
if log==0
c=[c,b(i)];
end
end
end
function rr=findrc(row)
switch row
case {1 2 3}
rr=0;
case {4 5 6}
rr=1;
otherwise
rr=2;
end
end
clear,clc
%骨灰级
%%给定一个初始的9*9阶矩阵,空白位置用0代替,一下eg是一个事例
%%%%%%%%%%%%%%主程序
A=zeros(9,9);
A(1,[1 2 6 8])=[2 4 5 8];
A(2,[1 3 5 8])=[8 9 3 5];
A(3,[7])=[3];
A(4,[3 6 8 9])=[4 9 1 5];
A(6,[1 2 4 7])=[3 9 8 2];
A(7,[3])=[1];
A(8,[2 5 7 9])=[2 9 7 3];
A(9,[2 4 8 9])=[3 7 6 2];
disp('the inital condition is : ')
A %显示初始值
main(A);
load result
disp('the result is : ')
A 展开
function [i,j,P]=findmp(A)
temp=zeros(9,9);
temp(A>0)=10;
for row=1:9
for col=1:9
if A(row,col)==0
r=A(row,:); r=r(r>0);
c=A(:,col); c=c(c>0);
rc1=and_log(r,c);%行列不同元素放在rc中
rr=findrc(row);
cc=findrc(col);
rc2=reshape(A(rr*3+1:rr*3+3,cc*3+1:cc*3+3),1,9);
rc2=rc2(rc2>0);
total=and_log(rc1,rc2);
temp(row,col)=9-length(total);
end
end
end
[v,i]=min(temp);
[v,j]=min(v);
i=i(j);
row=i;
col=j; %以下找出可能元素
r=A(row,:); r=r(r>0);
c=A(:,col); c=c(c>0);
rc1=and_log(r,c);
rr=findrc(row);
cc=findrc(col);
rc2=reshape(A(rr*3+1:rr*3+3,cc*3+1:cc*3+3),1,9);
rc2=rc2(rc2>0);
total=and_log(rc1,rc2);
P=[];
for kkk=9:-1:1
if isempty(find(total==kkk))==1
P=[P,kkk];
end
end
end
function main(A)
if isempty(find(A==0))==1
save result A
return;
end
[i,j,P]=findmp(A);
if length(P)==0
return;
else
for k=1:length(P)
A(i,j)=P(k);
main(A);
end
end
end
function c=and_log(a,b)
c=a;
for i=1:length(b)
log=0;
for j=1:length(a)
if b(i)==a(j)
log=1;
break;
end
end
if log==0
c=[c,b(i)];
end
end
end
function rr=findrc(row)
switch row
case {1 2 3}
rr=0;
case {4 5 6}
rr=1;
otherwise
rr=2;
end
end
clear,clc
%骨灰级
%%给定一个初始的9*9阶矩阵,空白位置用0代替,一下eg是一个事例
%%%%%%%%%%%%%%主程序
A=zeros(9,9);
A(1,[1 2 6 8])=[2 4 5 8];
A(2,[1 3 5 8])=[8 9 3 5];
A(3,[7])=[3];
A(4,[3 6 8 9])=[4 9 1 5];
A(6,[1 2 4 7])=[3 9 8 2];
A(7,[3])=[1];
A(8,[2 5 7 9])=[2 9 7 3];
A(9,[2 4 8 9])=[3 7 6 2];
disp('the inital condition is : ')
A %显示初始值
main(A);
load result
disp('the result is : ')
A 展开
2个回答
展开全部
基本思路就是穷举,然后判断对错,保存结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我已给你分开成小文件,请把 qq号留下,我发过去,再讲解用法。
追问
1246519557不好意思刚看见,谢谢!
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询