C语言 回(蛇)形矩阵

1.起点在左上角的蛇形矩阵
如果int[N][N]={};有问题(编译器不支持这种初始化为0的方法),就用两个循环来时使二维数组的每个数初始化为0。
(1)做围栏防止出界

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4

main(void)
{
    int N, direct = right, x = 1, y = 1 ;    
    printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;    
    scanf("%d", &N) ;    
    int a[N+2][N+2] ={} ;    
    for (int i = 0 ; i < N+2 ; i++)        
    for (int j = 0 ; j < N+2 ; j++)        
    {            
        if (0 == i || N+1 == i || 0 == j || N+1 == j)            
            a[i][j] = -1 ;        
    }    
    for (int i = 1 ; i <= N*N ; i++)    
    {        
        a[x][y] = i ;        
        switch (direct)        
        {            
            case right :                
            if (a[x][y+1] != 0)                
            {                    
                direct = down ;                    
                x++ ;                
            }                
            else                    
            y++ ;                
            break ;            
            case down :                
            if (a[x+1][y] != 0)                
            {                    
                direct = left ;                    
                y-- ;                
            }                
            else                    
            x++ ;                
            break ;            
            case left :                
            if (a[x][y-1] != 0)                
            {                    
                direct = up ;                    
                x-- ;                
            }                
            else                    
            y-- ;                
            break ;            
            case up :                
            if (a[x-1][y] != 0)                
            {                    
                direct = right ;                    
                y++ ;                
            }                
            else                    
            x-- ;                
            break ;        
        }     
    }    
    for (int i = 1 ; i < N+1 ; i++)    
    {        
        for (int j = 1 ; j < N+1 ; j++)            
        printf("%-4d", a[i][j]) ;        
        printf("\n") ;    
    }
} 

(2)用 if语句 防止出界
注: 二维数组一维角标出界,编译器会把它当一维数组使用
①顺时针

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4

void main(void)
{
    int N, direct = right, x = 0, y = 0 ;        
    printf("输入你要打印的N×N矩阵的N:\n") ;        
    scanf("%d", &N) ;        
    int a[N][N] ={} ;        
    for (int i = 1 ; i <= N*N ; i++)        
    {                
        a[x][y] = i ;                
        switch (direct)                
        {                        
            case right :                                
                if (a[x][y+1] != 0 || y > N-2)                                
                {                                        
                    direct = down ;                                        
                    x++ ;                                
                }                                
                else                                        
                    y++ ;                               
                break ;                        
            case down :                                
                if (a[x+1][y] != 0 || x > N-2)                                
                {                                        
                    direct = left ;                                        
                    y-- ;                                
                }                                
                else                                        
                    x++ ;                                
                break ;                        
            case left :                                
                if (a[x][y-1] != 0)                                
                {                                        
                    direct = up ;                                        
                    x-- ;                                
                }                                
                else                                        
                    y-- ;                                
                break ;                        
            case up :                                
                if (a[x-1][y] != 0)                                
                {                                        
                    direct = right ;                                        
                    y++ ;                                
                }                                
                else                                       
                    x-- ;                                
                break ;                
        }         
    }        
    for (int i = 0 ; i < N ; i++)        
    {                
        for (int j = 0 ; j < N ; j++)                        
            printf("%-4d", a[i][j]) ;                
        printf("\n") ;        
    }
}

②逆时针

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4

main(void)
{
    int N, direct = down, x = 0, y = 0 ;    
    printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;    
    scanf("%d", &N) ;    
    int a[N][N] ={} ;    
    for (int i = 1 ; i <= N*N ; i++)    
    {        
        a[x][y] = i ;        
        switch (direct)        
        {            
            case right :                
                if (a[x][y+1] != 0)                
                {                    
                    direct = up ;                    
                    x-- ;                
                }                
                else                    
                    y++ ;                
                break ;            
            case down :                
                if (a[x+1][y] != 0)                
                {                    
                    direct = right ;                   
                    y++ ;                
                }                
                else                    
                    x++ ;                
                break ;            
            case left :                
                if (a[x][y-1] != 0)                
                {                    
                    direct = down ;                    
                    x++ ;                
                }                
                else                    
                    y-- ;                
                break ;            
            case up :                
                if (a[x-1][y] != 0 || x < 1)                
                {                    
                    direct = left ;                    
                    y-- ;                
                }                
                else                    
                    x-- ;                
                    break ;        
        }     
    }    
    for (int i = 0 ; i < N ; i++)    
    {        
        for (int j = 0 ; j < N ; j++)             
            printf("%-4d", a[i][j]) ;        
        printf("\n") ;    
    }
}

2.起点在中间的蛇形矩阵
(1)最大值在左上角
①顺时针

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4

main(void)
{
    int N, direct = down, x = 0, y = 0 ;    
    printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;    
    scanf("%d", &N) ;    
    int a[N][N] ={} ;    
    for (int i = N*N ; i > 0 ; i--)    
    {        
        a[x][y] = i ;        
        switch (direct)        
        {            
            case right :                
                if (a[x][y+1] != 0)                
                {                    
                    direct = up ;                    
                    x-- ;                
                }                
                else                    
                    y++ ;                
                break ;            
            case down :                
                if (a[x+1][y] != 0)                
                {                    
                    direct = right ;                    
                    y++ ;               
                }                
                else                    
                    x++ ;                
                break ;            
            case left :               
                if (a[x][y-1] != 0)                
                {                    
                    direct = down ;                    
                    x++ ;                
                }                
                else                    
                    y-- ;                
                break ;            
            case up :                
                if (a[x-1][y] != 0 || x < 1)                
                {                    
                    direct = left ;                    
                    y-- ;                
                }                
                else                    
                    x-- ;                
                break ;        
        }     
    }    
    for (int i = 0 ; i < N ; i++)    
    {        
        for (int j = 0 ; j < N ; j++)            
            printf("%-4d", a[i][j]) ;        
        printf("\n") ;    
    }
}

②逆时针

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4
main(void)
{
    int N, direct = right, x = 0, y = 0 ;        
    printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;        
    scanf("%d", &N) ;        
    int a[N][N] ={} ;        
    for (int i = N*N ; i > 0 ; i--)        
    {                
        a[x][y] = i ;                
        switch (direct)                
        {                        
            case right :                                
            if (a[x][y+1] != 0 || y > N-2)                                
            {                                        
                direct = down ;                                        
                x++ ;                                
            }                                
            else                                        
            y++ ;                                
            break ;                        
            case down :                                
            if (a[x+1][y] != 0 || x > N-2)                                
            {                                        
                direct = left ;                                        
                y-- ;                               
            }                                
            else                                        
            x++ ;                                
            break ;                        
            case left :                               
            if (a[x][y-1] != 0)                                
            {                                        
                direct = up ;                                        
                x-- ;                                
            }                                
            else                                        
            y-- ;                                
            break ;                        
            case up :                                
            if (a[x-1][y] != 0)                                
            {                                        
                direct = right ;                                        
                y++ ;                                
            }                                
            else                                        
            x-- ;                                
            break ;                
        }         
    }        
    for (int i = 0 ; i < N ; i++)        
    {                
        for (int j = 0 ; j < N ; j++)                        
        printf("%-4d", a[i][j]) ;                
        printf("\n") ;        
    }
}

(2)最大值在右下角
①顺时针类似上面
②逆时针

#include  <stdio.h>   
#define right 1
#define down 2
#define left 3
#define up 4

main(void)
{
    int N, direct = left ;        
    printf("输入你要打印的N×N矩阵的N(N为奇数):\n") ;        
    scanf("%d", &N) ;        
    int x = N-1, y = N-1, a[N][N] ={} ;        
    for (int i = N*N ; i > 0 ; i--)        
    {                
        a[x][y] = i ;                
        switch (direct)                
        {                        
            case right :                                
            if (a[x][y+1] != 0)                                
            {                                        
                direct = down ;                                        
                x++ ;                                
            }                                
            else                                        
            y++ ;                                
            break ;                        
            case down :                                
            if (a[x+1][y] != 0)                                
            {                                        
                direct = left ;                                        
                y-- ;                               
            }                                
            else                                        
            x++ ;                                
            break ;                       
            case left :                              
            if (a[x][y-1] != 0 || y < 1)                                
            {                                       
                direct = up ;                                        
                x-- ;                               
            }                                
            else                                        
            y-- ;                               
            break ;                       
            case up :                               
            if (a[x-1][y] != 0 || x < 1)                               
            {                                       
                direct = right ;                                        
                y++ ;                                
            }                                
            else                                        
            x-- ;                                
            break ;                
        }         
    }        
    for (int i = 0 ; i < N ; i++)        
    {                
        for (int j = 0 ; j < N ; j++)                        
        printf("%-4d", a[i][j]) ;                
    printf("\n") ;        
    }
}

其他情况类似上面

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值