Problem D. L05-04输出蛇形矩阵(蛇皮矩阵治好了我的精神内耗 T_T)

编程输出如下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;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值