如何用MATLAB编写九宫阵程序
看书的时候,午饭的时候看青年报,每期都有9*9的九宫阵。我突发奇想,写了一个matlab程序,解决了。
输入数据是一个9*9的数组。
其思路是,首先根据规则,确定每个盒子中的可能值,首先确定唯一可能值,尝试时选择可能性小的盒子进行处理。当它不起作用时,堆栈回来,更新值,再试一次。
程序源代码如下:(很多东西记不清楚了)
功能;
% input data =;
% input data =;
% input data =;
input data =;
xsize = size(input data);
对于i=1:xsize(1)
tempi=Inputdata(i,1);
tempj=Inputdata(i,2);
JGZ(tempi,tempj)=Inputdata(i,3);
AllData(JGZ(tempi,tempj))=AllData(JGZ(tempi,tempj))-1;
JGTData(tempi,tempj,1:9)= 0;
JGTData(tempi,tempj,JGZ(tempi,tempj))=JGZ(tempi,tempj);
JGTData(tempi,tempj,10)= 1;
JGTData(tempi,tempj,11)=JGZ(tempi,tempj);
结束
JGZ
JGTData
[JGZ1,JGTData1]=PDDJGT(JGZ,JGTData);
JGZ = JGZ 1;
JGTData = JGTData 1;
%%%%%%%判断是否有可确定的数。
因为i=1:9
对于j=1:9
如果JGTData(i,j,10)= = 1 & amp;可以确定Jgtdata (I,J,11) = = 0%。
JGZ(i,j)=max(JGTData(i,j,1:9));
JGTData(i,j,11)=JGZ(i,j);
结束
结束
结束
JGZ
JGTData(:,:,10);
%%%%%%%%
JGTPD=zeros(9,9);
while max(max(JGTPD~=JGTData(:,:,10)))
JGTPD=JGTData(:,:,10);
%%%%%%%%第二次
[JGZ1,JGTData1]=PDDJGT(JGZ,JGTData);
JGZ = JGZ 1;
JGTData = JGTData 1;
%%%%%%%判断是否有可确定的数。
因为i=1:9
对于j=1:9
如果JGTData(i,j,10)= = 1 & amp;可以确定Jgtdata (I,J,11) = = 0%。
if max(JGTData(i,j,1:9))& gt;0%是错误的
JGZ(i,j)=max(JGTData(i,j,1:9));
JGTData(i,j,11)=JGZ(i,j);
结束
结束
结束
结束
JGZ
JGTData(:,:,10);
结束
%%%%%%%%%%%%%添加一个启发式值。
nt data = 1;
ForT = 0;
TFT = 0;%有什么问题吗
% xsize = find(JGTPD = = 2);
% xsize = xsize(1);
%while xsize
而NTData & gt=1。ForT==0
nt data = 1;
JGTN = 1;
JGTNData(JGTN,:)=zeros(9,9);
而max(max(JGTPD~=ones(9,9))& amp;TFT==0
而max(max(JGTPD~=ones(9,9))& amp;TFT==0
xsize = find(JGTPD = = 2);
if xsize~=[]
xsize = xsize(1);
tempi=mod(xsize,9);
如果温度==0
tempi = 9;
tempj = floor(xsize/9);
其他
tempj = floor(xsize/9)+1;
结束
tempsize=find(JGTData(tempi,tempj,1:9)>0);
TData(NTData,1:4)=[tempi,tempj,(JGTData(tempi,tempj,tempsize(1))),(JGTData(tempi,tempj,tempsize(2))];%添加一个值,同时保留另一个值。
TAData(NTData,1:9,1:9,1:11)= jgt data;
TAJGZ(NTData,1:9,1:9)= JGZ;
JGZ(tempi,tempj)=TData(NTData,3);
JGTData(tempi,tempj,1:9)= 0;
JGTData(tempi,tempj,JGZ(tempi,tempj))=JGZ(tempi,tempj);
JGTData(tempi,tempj,10)= 1;
JGTData(tempi,tempj,11)=JGZ(tempi,tempj);
nt data = nt data+1;
TFT = 0;
%%%%%%%重新判断
JGTPD=zeros(9,9);
while max(max(JGTPD~=JGTData(:,:,10)))
JGTPD=JGTData(:,:,10);
%%%%%%%%第二次
[JGZ1,JGTData1]=PDDJGT(JGZ,JGTData);
JGZ = JGZ 1;
JGTData = JGTData 1;
%%%%%%%判断是否有可确定的数。
因为i=1:9
对于j=1:9
如果JGTData(i,j,10)= = 1 & amp;可以确定Jgtdata (I,J,11) = = 0%。
if max(JGTData(i,j,1:9))& gt;0%是错误的
JGZ(i,j)=max(JGTData(i,j,1:9));
JGTData(i,j,11)=JGZ(i,j);
其他
TFT = 1;%是错误的
结束
结束
结束
结束
JGZ
JGTData(:,:,10);
结束%%%while
if min(min(JGTPD))==0
TFT = 1;
结束
Else%%%%%%不能填写。
TFT = 1;%是错误的
结束
结束%%%%%while
if ftt = = 1%由于错误退出。
如果NTData & gt0
nt data = nt data-1;
tempi=TData(NTData,1);
tempj=TData(NTData,2);
因为i=1:9
对于j=1:9
JGTData(i,j,1:11)= TAData(NTData,I,j,1:11);
JGZ(i,j)=TAJGZ(NTData,I,j);
结束
结束
% JGTData=TAData(NTData,1:9,1:9,1:11);
JGZ(tempi,tempj)=TData(NTData,4);
JGTData(tempi,tempj,1:9)= 0;
JGTData(tempi,tempj,JGZ(tempi,tempj))=JGZ(tempi,tempj);
JGTData(tempi,tempj,10)= 1;
JGTData(tempi,tempj,11)=JGZ(tempi,tempj);
JGTPD=JGTData(:,:,10);
TFT = 0;
其他
JGTPD=ones(9,9);
end%%if
结束%%%if
结束%%%while
JGTNData(JGTN,:)= JGZ
JGTN = JGTN+1;
if ftt = = 1%由于错误退出。
如果NTData & gt1
nt data = nt data-1;
tempi=TData(NTData,1);
tempj=TData(NTData,2);
因为i=1:9
对于j=1:9
JGTData(i,j,1:11)= TAData(NTData,I,j,1:11);
JGZ(i,j)=TAJGZ(NTData,I,j);
结束
结束
% JGTData=TAData(NTData,1:9,1:9,1:11);
JGZ(tempi,tempj)=TData(NTData,4);
JGTData(tempi,tempj,1:9)= 0;
JGTData(tempi,tempj,JGZ(tempi,tempj))=JGZ(tempi,tempj);
JGTData(tempi,tempj,10)= 1;
JGTData(tempi,tempj,11)=JGZ(tempi,tempj);
JGTPD=JGTData(:,:,10);
TFT = 0;
其他
JGTPD=ones(9,9);
堡垒= 1;
end%%if
结束%%%if
JGTPD=zeros(9,9);
NTData
JGZ
end % %而NData==0
函数[JGZ2,JGTData2]=PDDJGT(JGZ1,JGTData1)
%%%%%%%%%判断
因为i=1:9
对于j=1:9
如果JGZ1(i,j)>0%有数据。从其他人那里清除这些数据。
对于k=1:9%水平
如果j~=k
if JGTData1(i,k,JGZ1(i,j))& gt;0
JGTData1(i,k,JGZ1(i,j))= 0;
JGTData1(i,k,10)=JGTData1(i,k,10)-1;
结束
结束
结束
对于k=1:9%列
如果i~=k
if JGTData1(k,j,JGZ1(i,j))& gt;0
JGTData1(k,j,JGZ1(i,j))= 0;
JGTData1(k,j,10)=JGTData1(k,j,10)-1;
结束
结束
结束
%%%%%%%%%%%%小单元格
for I 1 =(ceil(I/3)-1)* 3+1:(ceil(I/3)-1)* 3+3
对于j 1 =(ceil(j/3)-1)* 3+1:(ceil(j/3)-1)* 3+3
if I 1 ~ = I & amp;j1~=j
如果JGTData1(i1,j1,JGZ1(i,j))& gt;0
JGTData1(i1,j1,JGZ1(i,j))= 0;
JGTData1(i1,j1,10)= jgtdata 1(I 1,j1,10)-1;
结束
结束
结束
结束
结束
结束
结束
jgtdata 2 = jgtdata 1;
jgz 2 = jgz 1;
结束