基础练习 回形取数
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
思路:以一个circle为循环标记,类似于往里边绕圈的感觉,每绕一圈,要遍历的元素显然越来越少,用四个for循环分别输出左边下边右边上边,不过这四种输出的方式比较难想,以 count < col * row 为循环结束标志即可。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 int main(void) 6 { 7 int row, col; 8 int i, j,k,h; 9 int** matrix; 10 11 scanf("%d %d", &row, &col); 12 matrix = (int **)malloc(sizeof(int*) * row); 13 for (i = 0; i < row; i++) 14 { 15 matrix[i] = (int *)malloc(sizeof(int) * col); 16 } 17 for (i = 0; i < row; i++) 18 { 19 for (j = 0; j < col; j++) 20 { 21 scanf("%d", &matrix[i][j]); 22 } 23 } 24 25 int circle = 0; 26 int count = 0; 27 28 while (count < row * col) 29 { 30 for (i = circle; i < row - circle && count < row * col; i++) //左边 31 { 32 printf("%d ", matrix[i][circle]); 33 count += 1; 34 } 35 for (j = circle + 1; j < col - circle && count < row * col; j++) //下边 36 { 37 printf("%d ", matrix[row - 1 - circle][j]); 38 count += 1; 39 } 40 for (k = row - 2 - circle; k >= circle && count < row * col; k--) //右边 41 { 42 printf("%d ", matrix[k][col - 1 - circle]); 43 count += 1; 44 } 45 for (h = col - 2 - circle; h >= circle + 1 && count < row * col; h--) //上边 46 { 47 printf("%d ", matrix[circle][h]); 48 count += 1; 49 } 50 circle += 1; 51 } 52 return 0; 53 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端