任意阶魔方阵matlab程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function magiccube
sign=1;sign2=1;sign3=1;sign4=1;
while(1)
n=input('Please input the number you want:or you can input 0 to quit the action:');
if n==0
break;
end
if n<0
n=input('You have input a wrong number,Please input the number again:');
end
m=zeros(n);
if mod(n,4)==0 %算n为4的倍数的魔方阵
for i=1:n/2
sign6=1;
if sign3>0&&sign4==1&&sign6==1
sign3=sign3-1;sign6=0;
if sign3==0
sign4=0;
sign3=2;
end
for j=1:n
sign5=1;
if sign>0&&sign2==1&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=0;
end
m(n-i+1,j)=n*i-j+1;
m(i,n-j+1)=n^2+1-m(n-i+1,j);
end
if sign>0&&sign2==0&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=1;
end
m(i,n-j+1)=n*i-j+1;
m(n-i+1,j)=n^2+1-m(i,n-j+1);
end
end
end
if sign3>0&&sign4==0&&sign6==1
sign3=sign3-1;sign6=0;
if sign3==0
sign4=1;
sign3=2;
end
for j=1:n
sign5=1;
if sign>0&&sign2==1&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=0;
end
m(i,j)=n*(i-1)+j;
m(n-i+1,n-j+1)=n^2+1-m(i,j);
end
if sign>0&&sign2==0&&sign5==1
sign=sign-1;sign5=0;
if sign==0
sign=2;
sign2=1;
end
m(n-i+1,n-j+1)=n*(i-1)+j;
m(i,j)=n^2+1-m(n-i+1,n-j+1);
end
end
end
end
m
end
if mod(n,2)==1 %算n为奇数的魔方阵
m=zeros(n+1,n+1);
m(1,:)=-1;
m(:,n+1)=-1;
b=2;c=fix((n+1)/2);
m(b,c)=1;
for i=2:n^2
sign7=1;
if m(b-1,c+1)==0&&sign7==1
m(b-1,c+1)=m(b,c)+1;
b=b-1;c=c+1;sign7=0;
end
if m(b-1,c+1)~=-1&&m(b-1,c+1)~=0&&sign7==1 m(b+1,c)=m(b,c)+1;
b=b+1 ;
c=c;
sign7=0;
end
if m(b-1,c+1)==-1&&m(b-1,c)==-1&&m(b,c+1)==-1&&sign7==1
m(b+1,c)=m(b,c)+1;
b=b+1;c=c;sign7=0;
end
if m(b-1,c+1)==-1&&m(b-1,c)==-1&&sign7==1
a44=m(b-1,c+1);
a444=m(b-1,c);
m(n+1,c+1)=m(b,c)+1;
b=n+1;c=c+1;sign7=0;
end
if m(b-1,c+1)==-1&&m(b,c+1)==-1&&sign7==1 m(b-1,1)=m(b,c)+1;
b=b-1;c=1;sign7=0;
end
end
m(2:n+1,1:n)
end
if mod(n,2)==0&&mod(n,4)~=0 %算n为非4的倍数的偶数阶魔方阵
u=n/2;
v=(n/2-1)/2;
a=magic(n/2); %因前面算法已经算出奇数阶魔方阵,此处直接调用系统函数
b=magic(n/2)+u*u;
c=magic(n/2)+2*u*u;
d=magic(n/2)+3*u*u;
if v>=1
for i=1:v
mid=a(:,i);
a(:,i)=d(:,i);
d(:,i)=mid;
if i>=2
mid=b(:,u-i+2);
b(:,u-i+2)=c(:,u-i+2);
c(:,u-i+2)=mid;
end
end
mid2=a((u+1)/2,1);
a((u+1)/2,1)=d((u+1)/2,1);
d((u+1)/2,1)=mid2;
mid3=a((u+1)/2,(u+1)/2);
a((u+1)/2,(u+1)/2)=d((u+1)/2,(u+1)/2);
d((u+1)/2,(u+1)/2)=mid3;
end
m=[a,c;d,b]
end
end