http://rosettacode.org/wiki/Spiral_matrix中列举了所有编程语言的螺旋阵的解决算法.

那天自己用matlab尝试写算法,并没有查过资料,凭着自己的思路写了两段程序.
第一段:
function [b]=SpiralMatrix(n)
c=[0 n-1:-1:1;n-1 n-1:-1:1];i=1;j=1;d=0;t=1;y=1;b(1,1)=1;
for t=1:n
for y=1:2
switch d
case 1
b(i:1:i+c(y,t),j)=rot90(b(i,j):1:(b(i,j)+c(y,t)),3);i=i+c(y,t);
case 2
b(i,j:1:j+c(y,t))=b(i,j):1:(b(i,j)+c(y,t));j=j+c(y,t);
case 3
b(i:-1:i-c(y,t),j)=rot90(b(i,j)+c(y,t):-1:(b(i,j)));i=i-c(y,t);
case 4
b(i,j:-1:j-c(y,t))=rot90(b(i,j)+c(y,t):-1:(b(i,j)),2);j=j-c(y,t);d=0;
end
d=d+1;
end
end
第二段:
function [s]=SpiralMatrixNew(n)
c=[0 n-1:-1:1;n-1 n-1:-1:1];s=zeros(n,n);s(1,1)=1;
for j=1:n
for i=1:2
if c(i,j)~=0
a=fix((n-c(i,j)-2+i)/2);b=fix((n-1-c(i,j))/2);
s(1+b:1:n-fix((n-c(i,j))/2),1+a)=rot90(s(1+b,1+a):1:(s(1+b,1+a)+c(i,j)),3);
s=rot90(s,3);
end
end
end
s=rot90(s,(-1)^(rem(n,2)+1));
第一段和第二段的算法是差不多一样的...不同的是第二段利用了matlab的函数...比起第二段...第一段更好移植到C语言中...至少感觉rot90这样的函数效率还是很低的吧...
后来搜了一下网上的算法...貌似没有类似的...于是就发上来了..
我的算法大致如下:整体思想是通过确定要延伸的元素和延伸的个数和方向,然后延伸矩阵
分步:
1.先计算一种螺旋阵的特征矩阵.里面的数字代表每次要延伸的个数(这个矩阵其实是我自己找规律找出来的...)
2.通过要延伸个数和矩阵阶数...来确定要延伸元素的行标...通过延伸个数,矩阵阶数和特征矩阵的行标...来确定要延伸元素的列标...


类别:编程 查看评论
文章来源:http://hi.baidu.com/%D6%C7%D5%CC%B4%F3%CA%A6/blog/item/674c18df765c913362279855.html