看热闹来了
①说明思路:
三维立体螺旋矩阵通过变长二维数组实现,矩阵中最小数为1,最大数根据边长不同而不同。
第一步,先初始化二维数组为全0,为后面打印做准备
第二部,判断边长是奇是偶,为三维螺旋矩阵正面最后一步赋值做准备
第三步,利用三层循环给二维数组赋值,其中最里面一层为多个for循环,分别为矩阵上边右边下边左边赋值
第四步,利用双重循环打印三维螺旋矩阵图
②程序代码:
#include<stdio.h>
//屏幕太小,边长只到30,原则上任意边长都行
int main()
{
int i,j,p,q,n,m,k,x;
printf("请输入螺旋矩阵的边长(30之内):");
scanf("%d",&n);
int a[2*n-1][2*n-1];
for(i=0;i<2*n-1;i++)//初始化二维数组为全0
{
for(j=0;j<2*n-1;j++)
{
a[i][j]=0;
}
}
if(n%2==0)//判断奇数偶数
{
m=n/2;//偶数
}
else
{
m=n/2+1;//奇数
}
for(x=0;x<n;x++)//二维数组赋值实现三维螺旋矩阵图
{
for(k=x+1,p=0,q=x;p<m;p++)
{
i=p+n-1-q;
j=p+q;
if(n%2!=0&&p==m-1)//奇数最后一个数
{
a[i][j]=k;
break;
}
for(;j<n-1-p+q;j++,k++)//上边
{
a[i][j]=k;
}
for(;i<n*2-1-q-1-p;i++,k++)//右边
{
a[i][j]=k;
}
if(x>0)//非矩阵正面,只打印上右两边
{
a[i++][j]=k++;
break;
}
for(;j>0+p;j--,k++)//下边
{
a[i][j]=k;
}
for(;i>n-1+p;i--,k++)//左边
{
a[i][j]=k;
}
}
}
for(i=0;i<2*n-1;i++)//打印
{
for(j=0;j<n*2-1;j++)
{
if(a[i][j]==0)
{
printf(" ");
}
else if(j>=2*n-1-1-i&&j>=n-1)
{
printf("%-3d",a[i][j]);
}
else
{
printf("%-4d",a[i][j]);
}
}
printf("\n");
}
return 0;
}
③测试效果图:
希望大家有更好的实现方式!
[ 本帖最后由 小小战士 于 2012-12-12 15:13 编辑 ]