编程输出如下n阶蛇形矩阵,如n=5时有: 15 7 6 2 1 16 14 8 5 3 22 17 13 9 4 23 21 18 12 10 25 24 20 19 11
输入
整型n
输出
(每个数字之间用空格来间隔) 15 7 6 2 1 16 14 8 5 3 22 17 13 9 4 23 21 18 12 10 25 24 20 19 11
样例
标准输入复制文本 |
5 |
标准输出复制文本 |
(注:每个数字之间用空格来间隔,此处分行只是为了更容易理解蛇形的意思) 15 7 6 2 1 16 14 8 5 3 22 17 13 9 4 23 21 18 12 10 25 24 20 19 11 |
注:看代码是没有用的,注释是我自己研究网上给的通法自己草稿纸模拟得出来的,一定要在纸上一步一步跟着程序来模拟出矩阵,最后逆向思考一结合就能大致理解这坨又臭又长的代码说的是啥
#include <stdio.h>
int main (void)
{
int n,i,j,k=1,m=1; //k为方向
scanf("%d",&n);
int a[n][n];
i=0;
j=n-1;
a[i][j]=m;
while (m!=n*n)//到左下角时退出
{
if (k==1) //方向:向左移动
{
j--;
a[i][j]=++m;
if (i==0)//左边界往斜右下方走的情况
{
k=2;
}
else if (i==n-1)//下边界往斜左上方走的情况
{
k=3;
}
}
else if (k==2) //向斜右下方移动
{
i++;
j++;
a[i][j]=++m; //注:右下角这一情况已经在k==4得以解决~,所以在这里不用管
if (j==n-1&&i!=n-1)//右边界往下走(不包括右下角这一特殊情况)
{
k=4;
}
else if (j!=n-1&&i!=n-1)//正常情况没碰到下和右边界,继续往右下走
{
k=2;
}
else if (i==n-1)//下边界往左走的特殊情况(不包括右下角)
{
k=1;
}
}
else if (k==3) //向斜左上方移动
{
i--;
j--;
a[i][j]=++m;
if (i!=0&&j!=0)//正常情况没碰到左和上边界,继续往左上走
{
k=3;
}
else if (i==0&&j!=0)//只碰到上边界且不是左上角,往左走
{
k=1;
}
else if (j==0)//左上角往下走(处于左和上边界的特殊情况)
{
k=4;
}
}
else if (k==4) //向正下方移动
{
i++;
a[i][j]=++m;
if (j==n-1)//右边界往斜左上方走(包括右下角)
{
k=3;
}
else if (j==0)//左边界要往下走的情况
{
k=2;
}
}
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("%-d ",a[i][j]);
}
printf("\n");
}
return 0;
}