题目描述

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

输入

输入第一行是两个不超过200的正整数m,  n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。

输出

输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

样例输入

3  3 1  2  3 4  5  6 7  8  9 

样例输出

1 4 7 8 9 6 3 2 5

这道题其实就是一个找规律的题,找好规律后几个循环就可以完成输出。

如上图所示,m为行数,n为列数,以一个m=5,n=5的5*5的矩阵为例,先忽略数字,把每一个数字当作矩阵中的一个点,由题意可知输出顺序是从外圈到内圈的逆时针顺序。以最外圈为例,其输出为从(0,0)到(m-1,0)的红色点,然后是橙色点,然后是黄色,最后是绿色,按照逆时针的顺序,外圈输出完毕。

如上图所示为第二圈,就是以(1,1)为起始点的圈,其顺序依旧是红、橙、黄、绿,第二圈输出完毕,最后是内圈(2,2),只有一个点,直接输出。这样,一个矩阵就输出完毕。

不难发现其中的输出规律,每次输出按圈逆时针输出,从外圈到内圈,起始点为(0,0),(1,1,),(2,2)。也就是说,每次只要找到起始点,然后按照顺序进行红、橙、黄、绿四次输出就可以了。

假设每次的起始点为(x,x)

红色的点为:(x,x)到(m-1-x,x)                                     x坐标依次加1

橙色的点为:(m-1-x,x+1)到(m-1-x,n-1-x)                    y坐标依次加1

黄色的点为:(m-2-x,n-1-x)到(x,n-1-x)                         x坐标依次减1

绿色的点为:(x,n-2-x)到(m-1-x,x+1)                            y坐标依次减1

通过以上的规律,每次更换不同的起始点,通过四个for循环依次输出红、橙、黄、绿点,直至全部输完。

起始点就是每一圈的第一个点,想要找到起始点首选要知道圈数。

全是应该是(min(m,n)+1)/2  ,即行、列中最小数加一除2,除数是取整,由此可得圈数l,起始点则是(0,0)到(l-1,l-1)

第一个循环是起始点循环,然后每个起始点控制的输出再通过四个方向循环输出。

有两种特殊情况需要注意

1、m<n,且m为单数

这种情况在输出完外圈后,内圈只有一个从左到右的横向输出。

2、n<m,n为单数

这种情况在输出完外圈后,内圈只有一个从上到下的纵向输出

因此在四个方向输出前要判断是否是最内圈,且最内圈是否满足以上两种情况,如果满足则直接横向或者纵向输出,如果不满足再进行四个方向的输出。

代码:

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);   //输入行数和列数 
    int a[m][n];
    int min=m<n?m:n;
    int len=(min+1)/2;
    for(int i=0;i<m;i++)     //输入矩阵中的数字 
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }

for(int x=0;x<len;x++)         //按照起始点依次按圈逆时针输出 
    {
        if(x==len-1&&((min+1)%2)==0)    //如果是最内圈 
        {
            if(m<n)                //这种情况是横向输出 
            {
                for(int i=x;i<n-x;i++)
                {
                   printf("%d ",a[x][i]);
                   }
                
            }
            else                      //纵向输出 
            {
                for(int i=x;i<m-x;i++)
                {
                   printf("%d ",a[i][x]);
                }
                
            }
        }
        else
       {
    
               for(int i=x;i<m-x;i++)   //红色的点 
            {
               printf("%d ",a[i][x]);
            }
    
            for(int i=x+1;i<n-x;i++)    //橙色的点 
            {
                printf("%d ",a[m-1-x][i]);
            }
    
            for(int i=m-2-x;i>=x;i--)    //黄色的点 
             {
                printf("%d ",a[i][n-1-x]);
            }
    
            for(int i=n-2-x;i>x;i--)     //绿色的点 
            {
                printf("%d ",a[x][i]);
            }
    
        }
    }
    return 0;
 }

蓝桥杯练习——回形取数相关推荐

  1. C++蓝桥杯 基础练习之回形取数

    C++ 蓝桥杯题目讲解汇总(持续更新) VIP试题 回形取数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度 ...

  2. python【蓝桥杯vip练习题库】BASIC-25 回形取数

    试题 基础练习 回形取数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. ...

  3. [蓝桥杯]回形取数-方向向量+模拟

    题目描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m行每 ...

  4. 蓝桥杯 java基础练习 回形取数

    问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...

  5. 蓝桥杯 基础练习 回形取数

    问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...

  6. [Java] 蓝桥杯BASIC-25 基础练习 回形取数

    问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...

  7. 蓝桥杯 BASIC-25 基础练习 回形取数

    问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...

  8. 【蓝桥杯】【回形取数】

    [题目] 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列 ...

  9. 蓝桥杯——特殊回文数

    蓝桥杯--特殊回文数 问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 输入格式 输入一行, ...

最新文章

  1. rot90--矩阵旋转
  2. [BZOJ 5072][Lydsy1710月赛]小A的树
  3. [NBUT 1458 Teemo]区间第k大问题,划分树
  4. JavaScript强化教程 —— Cocos2d-JS极速调试技巧
  5. c语言怎么判断文件类型,判断你的文件是否为合法的PE文件和应用类型
  6. AngularJS案例:简单计算
  7. matlab如何把实验结果记录在文件中,实验一Matlab基本操作
  8. linux脚本调用job,linux shell - 脚本中调用fg调取后台任务报错
  9. Web Developer's Handbook
  10. 亚像素边缘提取方法总结
  11. paip.网页右键复制菜单限制解除解决方案
  12. 中职学校计算机课听课记录表,中职语文听课记录10篇
  13. 使用文档检查器后,think-cell 元素损坏
  14. 移动端后台管理系统框架
  15. H5网页实现录音并转换为文字
  16. Ghost参数使用详解
  17. HTML文件如何静态引入scss文件
  18. 录游戏视频的屏幕软件
  19. allt什么意思_all是什么意思_all怎么读_all翻译_用法_发音_词组_同反义词_全部的-新东方在线英语词典...
  20. 网站常用攻击技术详解

热门文章

  1. Android自动化测试第二季(提高篇)-金阳光-专题视频课程
  2. stdout和stderr重定向
  3. 美团大数据平台架构实践
  4. log4j实现日志记录
  5. 【Metadata】二. EXIF详解
  6. cocos2dx基础篇(20) 扩展动作CCGridAction
  7. 2023njupt-南邮的《工程与社会》课程[ppt+论文(水文)]
  8. 最新版基于TP开发的9国语言海外多语言抢单源码+9色前端UI
  9. 中国物流与采购杂志中国物流与采购杂志社中国物流与采购编辑部2022年第14期目录
  10. Java位运算的基础及使用(意义)