如何用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;

结束