要求

给出二维数组,要求按顺时针打印二维数组。
例如给出
输入 int arr[][3]{1,2,3,4,5,6,7,8,9}
输出 [1,2,3,6,9,8,7,4,5]

解题思路

顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。

算法流程

1、求出用于返回列表的大小returnSize。
2、矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 val 。
3、“从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ;

3.1根据边界打印,即将元素按顺序添加至列表 val 尾部;
3.2边界向内收缩 1(代表已被打印);
3.3判断是否打印完毕(边界是否相遇),若打印完毕则跳出。
4、返回val

代码

#include<stdio.h>
#include<malloc.h>#define LOW 3
#define COL 3int* spiralOrder(int (*arr)[COL], int* returnSize){//计算数组的个数,也就是列表的长度*returnSize = COL*LOW;int* val = (int*)malloc(sizeof(int)*(*returnSize));//分别定义 左 右 上 下 的边界 int l = 0, r = COL - 1, t = 0, b = LOW - 1, x = 0;while (1){// left to right.for (int i = l; i <= r; i++)    //从左到右,i就等于左,i<=右{val[x++] = arr[t][i]; //在最上一行输出,变化的是列,所以列标=i}if (++t > b) break; //下面要走的是从上到下,所以先判断上边界+1是否比下边界大,如果大说明已经打印完全。// top to bottom.for (int i = t; i <= b; i++)  //从上到下,i就等于上,i<=下{val[x++] = arr[i][r]; //在最右一列输出,变化的是行,所以行标=i}if (l > --r) break;   //下面要走的是从右到左,所以先判断左边界是否比右边界-1大,如果大说明已经打印完全。// right to left.for (int i = r; i >= l; i--) //从右到左,i就等于右,i>=左{val[x++] = arr[b][i];    //在最后一行输出,变化的是列标,所以列表=i}if (t > --b) break; //下面要走的是从下到上,所以先判断上边界是否比下边界-1大,如果大说明已经打印完全。// bottom to top.for (int i = b; i >= t; i--) //从下到上,i就等于下,i>=上{val[x++] = arr[i][l];    //在最左一列输出,变化的是行标,所以行表=i}if (++l > r) break;    //下面要走的是从左到右,所以先判断左边界+1是否比右边界大,如果大说明已经打印完全。}return val;
}int main()
{//定义二维数组int arr[][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //用于接收val的列表的长度int returnSize;//定义arr2用来接收val的首地址int *arr2 = spiralOrder(arr, &returnSize);//打印列表valfor (int i = 0; i < returnSize; i++){printf("%d ", arr2[i]);}printf("\n");return 0;
}

运行结果

如果想打印3行4列或者其他多行多列,只要将一开始宏定义的LOW 和 COL数值一改,再将数组的值填好,就可以了。

下面附上逆时针打印数组的代码,跟顺时针打印的原理一模一样。

#define LOW 3
#define COL 3int main()
{int arr[][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int l = 0, r = COL - 1, t = 0, b = LOW - 1;l = 0, r = COL - 1, t = 0, b = LOW - 1;printf("逆时针打印二维数组  ");while (1){for (int i = t; i <= b; i++){printf("%d ", arr[i][l]);}if (++l > r) break;for (int i = l; i <= r; i++){printf("%d ", arr[b][i]);}if (t > --b) break;for (int i = b; i >= t; i--){printf("%d ", arr[i][r]);}if (l > --r) break;for (int i = r; i >= l; i--){printf("%d ", arr[t][i]);}if (++t > b) break;}return 0;
}

运行结果

如果各位博客们有看不懂得地方,或者我有写错的地方可以在下方评论区留言,会第一时间回复。

C语言 顺时针打印矩阵(二维数组)相关推荐

  1. c语言中二维数组怎么,c语言中什么是二维数组

    c语言中什么是二维数组 二维数组A[m][n],这是一个m行,n列的二维数组.以下是由应届毕业生小编整理关于c语言二维数组的内容,希望对大家有所帮助!更多相关内容请关注应届毕业生考试 网. c语言的二 ...

  2. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  3. C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中

    C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中 #include <stdio.h> int main(){int a[2][3]={{1,2,3},{4,5,6}}; // ...

  4. 4.编程打印一个二维数组中所有元素的和,并打印最大值,最小值(以及它们所在的行号和列号)

    /*晕呀,竟然做了一天,还不知道怎样做出来的.....*/ package HomeWork; import java.util.Arrays; /*4.编程打印一个二维数组中所有元素的和,并打印最大 ...

  5. C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题

    请教C语言中关于将二维数组复制到一个三维数组的问题 小白正在填写一段代码,是有点类似与俄罗斯方块的一段游戏代码,代码如下 要求在增加参数,变量和函数的情况下完成此代码,只能填写// write app ...

  6. c语言函数输出数组,如何让C语言函数返回一个二维数组

    为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int (*resul ...

  7. C语言用数组编程矩阵,二维数组—矩阵求和(C语言)

    昨天上机了,之前上机都觉得题目挺简单的,但昨天的题明显比以前难了好吗!字符串二维数组感觉也没教什么呀..所以我也做了蛮久,现依次把这几道题放在这里留作纪念. 题目1:请写一个程序,对于一个m行m列(2 ...

  8. c语言暴力求解法二维数组比较,【算法】搜索二维矩阵 暴力解法二分法 4种语言...

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1:输入:matrix = ...

  9. c语言中定义字母二维数组,C语言 | 数组

    原标题:C语言 | 数组 1. 一维数组的定义和使用通过对前面知识的学习,我们已经知道如何定义和使用一个一个的各种变量,但总有不够用的时候.举个例子,我要记录一个班32个同学C语言这科的成绩,难道要定 ...

最新文章

  1. NX,Canary,RELRO,PIE,Linux的4种保护机制讲解
  2. 计算机网络基础必备(三次握手,四次握手,以及HTTP协议相关)
  3. 表的插入、更新、删除、合并操作_20_通过表关联删除多张表
  4. vue prop不同数据类型(数组,对象..)设置默认值
  5. c#精彩编程200例百度云_永安市教育局被授予“人工智能编程教育试验区”
  6. Ubuntu安装包时报错 E:Unable to locate package xxx(如:python3-pip)
  7. 爬虫演练-动态的抓取cp网站数据的演练-注意要反爬
  8. (66)UART接口波特率是多少?以及异步采样时钟是多少频率?
  9. Blazor服务器应用程序中使用EF Core的多租户
  10. HttpClientUtils封装
  11. 【微信页面】移动端微信页面禁止字体放大
  12. 【微机原理与接口技术】学习笔记9 DMA控制器8237A
  13. 服务器背板电源维修,814835-B21 814832-001 DD-2901-3C-LF G9 HPE服务器电源背板
  14. zotero如何用markdown记笔记
  15. IDEA查看jks文件
  16. 【CSS】来自新时代的CSS
  17. 二分查找(普通、找第一个、找最后一个)
  18. Clojure的并发(一) Ref和STM
  19. 详解I2C(二)时序
  20. 金蝶云星空与钉钉集成案例

热门文章

  1. 计算机软件专业的中期目标,计算机软件工程专业职业生涯设计.doc
  2. 贵大计算机学院陈力,CCF贵州大学学生分会完成换届
  3. wpp助手怎么连接服务器,aewpp.com
  4. java script数据类型_typescript 基本数据类型
  5. java非负数校验_JavaScript正则表达式校验非负整数实例
  6. c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)
  7. 锐龙版和linux有什么区别,华为MateBook D 14锐龙版Linux版价格为何这么便宜
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的早教管理系统
  9. 基于JAVA+Servlet+JSP+MYSQL的宿舍管理系统
  10. Java元宵趣图_模仿百度首页“元宵节汤圆”动图(js的定时任务:setInterval)