关于c语言的矩阵螺旋输出思路和代码


前言

本篇文章主要分享自己写的一个c语言的矩阵螺旋输出思路和代码,希望能对大家有所帮助。

一、思路

  1. 首先是输入部分,我们新建一个二维数组matrix[m][n],并循环读入数据,读入数据的总数为m * n,注意为了方便理解,我从1开始计数而非0,即最后一个数据下表为m * n而不是m * n - 1。
  2. 然后进入输出部分,输出部分是一个嵌套4个小循环的大循环,可以分为4个小部分分别是向右、向下、向左、向上输出。每经历一次大循环,则代表经历过4个小循环的标志flag都会被清零,当输出至最后一个数据时,当前位置的下一个小循环就不会进行,flag仍为0,则break跳出循环,程序结束。
  3. 向右输出。循环限制条件是小于列的最大数n,当整个向右循环结束后,n要减1,代表最大列数减1。且当前行下标加1,代表当前位置垂直向下移动1。
  4. 向下输出。循环限制条件是小于行的最大数m,当整个向下循环结束后,m要减1,代表最大行数减1。且当前列下标减1,代表当前位置垂直向左移动1。
  5. 向左输出。循环限制条件是大于左限(limit_left),当整个向左循环结束后,limit_left要加1,代表左限加1,注意初始左限为0。且当前列下标减1,代表当前位置垂直向左移动1。
  6. 向上输出。循环限制条件是大于上限(limit_up),当整个向上循环结束后,limit_up要加1,代表上限加1。注意初始上限为1。且当前行下标加1,代表当前位置垂直向上移动1。
  7. 输出部分还有些小细节需要注意如由于for循环会多加减一次要注意恢复,输出最后一个数据注意后面不能有空格。
  8. ⭐代表每次向右、向下、向左、向上输出循环结束后,当前位置下标移动后的位置,也就是下个循环开始的位置。
    在这里插入图片描述

二、代码

#include <stdio.h>
#include <string.h>

int main() {
    int matrix[100][100] = {0};
    int m = 0, n = 0, temp = 0;
    int count_1 = 0, count_2 = 0;
    int limit_up = 1,limit_left = 0;
    int flag_1,flag_2,flag_3,flag_4;
    int i, j;  
    
    scanf("%d %d",&m,&n);//输入行和列数
    
    count_2 = m * n;//最大执行次数
    
    for(i = 1; i <= m; i++)//输入数据
    {
        for(j = 1; j <= n; j++)
        {
            scanf("%d",&matrix[i][j]);
        }
    }
     
    i = 1;//注意返回一
    j = 1;//注意返回一
    
   while(1)
   {
        
        flag_1 = 0;
        flag_2 = 0;
        flag_3 = 0;
        flag_4 = 0;
       
        for(; j <= n; j++)//向右输出
        {           
            flag_1 = 1;//当经过此循环,flag变1,提示程序还要继续
            count_1++;//每输出一个数计数加一
            if(count_1 == count_2)//当总计数到达最大值(行乘列就是最大值),代表程序结束
            printf("%d",matrix[i][j]);
            else
            printf("%d ",matrix[i][j]);  
        }
        
        if(flag_1 == 0)//程序结束
        {
            break;
        }
       
        i++;//当前位置垂直向下移动一
        j--;//多加一次,要注意减去
        n = n - 1;//列的最大值要减一
       
        for( ; i <= m; i++)//向下输出
        {
            flag_2 = 1;
            count_1++;
            if(count_1 == count_2)
            printf("%d",matrix[i][j]);
            else
            printf("%d ",matrix[i][j]);  
        }

        if(flag_2 == 0)
        {
            break;
        }
       
        i--;//多加一次,要注意减去
        j--;//当前位置向左移动一
        m = m - 1;//行的最大值减一
       
        for( ; j > limit_left; j--)//向左输出
        {         
            flag_3 = 1;
            count_1++;
            if(count_1 == count_2)
            printf("%d",matrix[i][j]);
            else
            printf("%d ",matrix[i][j]);
        }        

        if(flag_3 == 0)
        {
            break;
        }
       
        j++;//多减一次,要注意加一
        i--;//当前位置向上移动一
        limit_up++;//上限加一
        
        for( ; i >= limit_up ; i--)//向上输出
        {
            flag_4 = 1;
            count_1++;
            if(count_1 == count_2)
            printf("%d",matrix[i][j]);
            else
            printf("%d ",matrix[i][j]);
        }
          
        if(flag_4 == 0)
        {
            break;
        }   
       
        i++;//多减一次,要注意加一
        j++;//当前位置向右移动一
        limit_left++;//左限加一       
   }
    
    return 0;
}


总结

第一次分享自己的想法,希望能给大家带来帮助。如果大家有什么意见建议也欢迎留言讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值