C语言 蛇(非回)形矩阵

①输出如下的蛇形矩阵
1 2 6 7 12
3 5 8 11 13
4 9 10 14 15

#include  <stdio.h>
#define right 1
#define ledo 2
#define riup 3

main(void)
{
    int m, n, x = 0, y = 0, direct = right ;    
    printf("请输入行数m和列数n:\n") ;    
    scanf("%d%d", &m, &n) ;    
    int a[m][n] ;    
    for (int i = 1 ; i <= m*n ; i++)    
    {        
        a[x][y] = i ;        
        switch(direct)        
        {            
            case right :                
                y++ ;                
                direct = ledo ;                
                break ;             
            case ledo :                
                if (y < 1 && x < m-1)                
                {                    
                    x++ ;                    
                    direct = riup ;                
                }                
                else if (x == m-1)                
                {                    
                    y++ ;                    
                    direct = riup ;               
                }                
                else                     
                    x++, y-- ;                
                break ;              
            case riup :                
                if (x < 1 && y < n-1)                
                {                    
                    y++ ;                    
                    direct = ledo ;                
                }                
                else if (y == n-1)                
                {                    
                    x++ ;                   
                    direct = ledo ;                
                }                
                else                  
                    x--, y++ ;                
                break ;        
        }   
    }    
    for (int i = 0 ; i < m ; i++)    
    {        
        for (int j = 0 ; j < n ; j++)       
            printf("%-4d", a[i][j]) ;        
        printf("\n") ;   
   }
}

②输出如下所示蛇形矩阵
1 3 6 10
2 5 9 13
4 8 12 15
7 11 14 16
(1)输出为三角形的
1 3 6 10
2 5 9
4 8
7

#include  <stdio.h>

main(void)
{
    int m, n, k, s = 0 ;    
    printf("请输入行数m和列数n:\n") ;    
    scanf("%d%d", &m, &n) ;    
    int a[m][n] ;    
    for (int i = 0 ; i < m ; i++)    
    {        
        for (int j = 0 ; j < n ; j++)        
        {            
            k = i - j ;            
            if (k >= 0)                
            a[k][j] = s++ ;        
        }    
    }    
    for (int i = 0 ; i < m ; i++)    
    {        
        for (int j = i ; j < (m > n ? n : m) ; j++)        
        printf("%-4d", a[i][j-i]) ;        
        printf("\n") ;    
    }
}

(2)行列数必须相同的

#include  <stdio.h>

main(void)
{
    int n, x = 0, y = 0, s ;    
    printf("请输入行列数n:\n") ;    
    scanf("%d", &n) ;    
    int a[n][n] ;    
    for (int i = 1 ; i <= n*n ; i++)    
    {        
        a[x][y] = i ;        
        if (x <1 || y > n-2)        
        {            
            if (y > n-2)                
            s = x, x = y, y = s+1 ;            
            else                
            s = x, x = y+1, y = s ;        
        }        
        else            
        x--, y++ ;    
    }    
    for (int i = 0 ; i < n ; i++)    
    {       
        for (int j = 0 ; j < n ; j++)        
        printf("%-4d", a[i][j]) ;        
        printf("\n") ;    
    }
}

(3)行列数可以不同的

#include  <stdio.h>
#define riup 1
#define reset 2

main(void)
{
    int m, n, x = 0, y = 0, s = 1, direct = riup ;    
    printf("请输入行数m和列数n:\n") ;    
    scanf("%d%d", &m, &n) ;    
    int a[m][n] ;    
    for (int i = 1 ; i <= m*n ; i++)    
    {        
        a[x][y] = i ;        
        switch (direct)        
        {            
            case riup :                
            if (x < 1 || y > n-2)                
            {                    
                x = s++, y = 0 ;                    
                if (x == m-1)                    
                {                        
                    s = 1 ;                        
                    direct = reset ;                    
                }                
            }                
            else                    
                x--, y++ ;                
            break ;            
        case reset :            
            if (x < 1 || y > n-2)                
            {                    
                x = m-1, y = s++ ;                
            }                
            else                    
                x--, y++ ;                
            break ;        
        }    
    }    
    for (int i = 0 ; i < m ; i++)    
    {        
        for (int j = 0 ; j < n ; j++)        
        printf("%-4d", a[i][j]) ;        
        printf("\n") ;    
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值