最简单的想法(从每个打印的点看起)

关于这个问题,不管是顺时针还是逆时针,我们都可以把他看作四个动作(函数),向右,向下,向左,向上。初次之外,我们还要知道,每次做动作的起点以及打印的个数(界限),由此就可以想象出整个函数的结构。

int stx=0,sty=0;//起点X坐标,起点Y坐标,
int maxux=col-1,maxuy=row-1;//最大未打印X坐标(列,有效下标) ,最大未打印Y坐标(行,有效下标)
minux=0,minuy=0;//最小未打印X坐标 ,最小未打印Y坐标
void Move_Right(int (*arr)[4],int maxux,int* minuy,int *stx,int sty);
void Move_Down(int (*arr)[4],int* maxux,int maxuy,int stx,int *sty);
void Move_Left(int (*arr)[4],int minux,int* maxuy,int *stx,int sty);
void Move_Up(int (*arr)[4],int* minux,int minuy,int stx,int *sty);
/*关于函数的参数,第一个是需要打印的二维数组,第二个是列的边界,第三个是行的边界,第四第五是打印起始的坐标,其中带*的是需要在函数执行完修改的值*/

这四个函数的基本思路是一样的,我们就其中一个函数来详细讲解

void Move_Right(int (*arr)[4],int maxux,int* minuy,int *stx,int sty)//向右移动
{int x=*stx+1; //因为起始点已经再上个函数中已经输出了,不需要再次输出,加1跳过while( maxux >= x)//跟右边界(最大有效列)比较,输出,直到到边界上{printf("%5d ",arr[sty][x]);//输出x++;//移向下一个位置}*stx=x-1;//多加了1,需要减去*minuy=*minuy+1;//由于我们将第0行的元素已经输出打印完了,不需要再输出了,所以最小有效行减1
}

当然博主的代码还有许多可以优化的地方,就不再多说了。

完整代码:(顺时针,逆时针与其思路相同),

#include<stdio.h>
void Move_Right(int (*arr)[4],int maxux,int* minuy,int *stx,int sty)
{int x=*stx+1;while( maxux >= x){printf("%5d ",arr[sty][x]);x++;}*stx=x-1;*minuy=*minuy+1;
}
void Move_Left(int (*arr)[4],int minux,int* maxuy,int *stx,int sty)
{int x=*stx-1;while( x >= minux){printf("%5d ",arr[sty][x]);x--;}*stx=x+1;*maxuy=*maxuy-1;
}void Move_Down(int (*arr)[4],int* maxux,int maxuy,int stx,int *sty)
{int y=*sty+1;while(maxuy >= y){printf("%5d ",arr[y][stx]);y++;}*sty=y-1;*maxux=*maxux-1;
}void Move_Up(int (*arr)[4],int* minux,int minuy,int stx,int *sty)
{int y=*sty-1;while(y >= minuy){printf("%5d",arr[y][stx]);y--;}*sty=y+1;*minux=*minux+1;
}void clockwise(int (*arr)[4],int row,int col)//顺时针输出打印
{printf("顺时针打印如下: ");int stx=0,sty=0;//起点X坐标,起点Y坐标,int maxux=col-1,maxuy=row-1,minux=0,minuy=0;//最大未打印X坐标 ,最大未打印Y坐标,最小未打印X坐标 ,最小未打印Y坐标printf("%5d",arr[stx][sty]);while( maxux>minux || maxuy>minuy){Move_Right(arr,maxux,&minuy,&stx,sty);Move_Down(arr,&maxux,maxuy,stx,&sty);Move_Left(arr,minux,&maxuy,&stx,sty);Move_Up(arr,&minux,minuy,stx,&sty);}printf("\n");
}int main()
{int arr[5][4]={0,1,2,3,4,5,6,7,8,9,10,11,34,35,36,37,12,13,14,15};clockwise(arr,5,4);}

逆时针输出(Countercolockwise)

#include<stdio.h>
void CCW_Move_Up(int (*arr)[4],int* maxux,int minuy,int stx,int *sty)
{int y=*sty-1;while(y >= minuy){printf("%5d",arr[y][stx]);y--;}*sty=y+1;*maxux=*maxux-1;
}
void CCW_Move_Right(int (*arr)[4],int maxux,int* maxuy,int *stx,int sty)
{int x=*stx+1;while( maxux >= x){printf("%5d ",arr[sty][x]);x++;}*stx=x-1;*maxuy=*maxuy-1;
}
void CCW_Move_Left(int (*arr)[4],int minux,int* minuy,int *stx,int sty)
{int x=*stx-1;while( x >= minux){printf("%5d ",arr[sty][x]);x--;}*stx=x+1;*minuy=*minuy+1;
}void CCW_Move_Down(int (*arr)[4],int* minux,int maxuy,int stx,int *sty)
{int y=*sty+1;while(maxuy >= y){printf("%5d ",arr[y][stx]);y++;}*sty=y-1;*minux=*minux+1;
}
void Counterclockwise(int (*arr)[4],int row,int col)//逆时针
{printf("逆时针打印如下: ");int stx=0,sty=0;//起点X坐标,起点Y坐标,int maxux=col-1,maxuy=row-1,minux=0,minuy=0;//最大未打印X坐标 ,最大未打印Y坐标,最小未打印X坐标 ,最小未打印Y坐标printf("%5d",arr[stx][sty]);while( maxux>minux || maxuy>minuy){CCW_Move_Down(arr,&minux,maxuy,stx,&sty);CCW_Move_Right(arr,maxux,&maxuy,&stx,sty);CCW_Move_Up(arr,&maxux,minuy,stx,&sty);CCW_Move_Left(arr,minux,&minuy,&stx,sty);         }   printf("\n");
}
int main()
{int arr[5][4]={0,1,2,3,4,5,6,7,8,9,10,11,34,35,36,37,12,13,14,15};Counterclockwise(arr,5,4);}

进一步的想法(从整个打印的矩形看)

我们可以把打印过程分解为打印一个个互相嵌套的矩形框,对应每个矩形框的打印过程都是相同的,我们只要确定要打印框的大小就可以打印了,特殊情况特殊处理下(最后的打印可能是一行,或一竖)

这里只写了顺时针

#include<iostream>
using namespace std;
void Print(int(*arr)[4], int a, int b, int c, int d)
{if (a == c){for (int i = b; b >= d; i++){cout << arr[a][i] << " ";}}else if (b == d){for (int i = a; a >= c; i++){cout << arr[i][b] << " ";}}else{for (int i = b; i <= d; i++){cout << arr[a][i]<<" ";}for (int i = a+1; i <= c; i++){cout << arr[i][d] << " ";}for (int i = d-1; i >= b; i--){cout << arr[c][i] << " ";}for (int i = c-1; i > a; i--){cout << arr[i][b] << " ";}}
}
void process(int(*arr)[4], int x, int y)//旋转打印
{int a = 0, b = 0, c = x - 1, d = y - 1;while (a <= c && b <= d){Print(arr, a, b, c, d);a++;b++;c--;d--;}
}

这样写起来,边界的检测更容易,代码写起来也简单些

顺/逆时针输出二维数组/矩阵 C语言相关推荐

  1. c#输出二维数组矩阵

    int[,] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };             Console.WriteLine("输出的是原始数组 ...

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

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

  3. c语言二维数组对角线输出字符,输出二维数组对角线上的数 c语言 二维数组 对角线相加...

    1.编写程序,把下面的数据输入到一个二维数组中: 25 36 78 13 12 26 8我自己编的,用VISUAL C++6.0 测试过了 #include"stdio.h" vo ...

  4. C语言学习之利用指针输出二维数组任一行任一列元素的值

    利用指针输出二维数组任一行任一列元素的值. int main(){int a[3][4];int i,j,x,y;int (*p)[4];//指针变量p指向包含4个整型元素的一维数组printf(&q ...

  5. C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值

    有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. int main(){int a[3][4];int i,j,*p;//p是 int *型指针变量printf("请 ...

  6. 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...

    例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...

  7. (c语言)编程输出二维数组中元素的最大值,要求用指针实现。

    (c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...

  8. Java二维数组-输出二维数组的和

    自定义一个二维数组,输出二维数组中所有元素和; public static void main(String[] args) {int[][] arr = new int[][] { { 1, 9, ...

  9. 算法笔记-螺旋输出二维数组

    算法笔记-螺旋输出二维数组 1.思路:二维数组看做一个坐标,遍历者当成一个人,那么我们定义这个人的位置,以及当前面朝的方向,还有这个人转向次数.初始位置,人在(x,y)=(0,0)处,面向右方,右方的 ...

最新文章

  1. matlab内存管理(二)
  2. 价值1.4万元的课程讲义开源,fast.ai发布新书源代码,登GitHub趋势榜第一
  3. 《数字视频和高清:算法和接口》一第1章 光 栅 图 像
  4. 伺服系统控制网络的重要性! 现场总线的重要性! SSCNET运动控制系统与发展趋势
  5. android-api28转换到api19-不能编译
  6. 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...
  7. mysql的索引缺点_「缺点有哪些」数据库索引是什么 有什么优缺点 - seo实验室
  8. SQL Server 机考,用T-SQL编写 简单实例
  9. oracle多少条commit比较好,oracle什么时候须要commit
  10. 安装PdaNet以连接Android设备
  11. Calling LoadLibraryEx on ISAPI filter failed
  12. 桌面上的ie,小游戏,极品美媚图,免费新电影,淘宝网今日打折特价区的图标无法删除,怎么办?
  13. [字符串题-java实现]20. 有效的括号
  14. SVG实现圆形进度条
  15. 2020-10-30
  16. Wireshark协议源代码
  17. corrcoef(corrcoef函数R和P是什么意思)
  18. iOS小技能:iOS无线真机调试
  19. 类变量、成员变量、局部变量存放位置
  20. 从一张图看员工绩效管理

热门文章

  1. 平板电脑:给力的移动互联网终端
  2. 鹅开口易得什么症状 什么药防治鹅开口病快
  3. 北京内推 | 阿里达摩院招聘大型语言模型(LLM)应用方向实习生
  4. android palette组件用法,Android Material Design:使用Palette优化界面色彩搭配。
  5. @wraps()装饰器的作用
  6. MySQL 联级删除(on delete cascade)应用
  7. 人教版 初步使用计算机 教案,人教版信息技术六年级上册教案
  8. viewpager嵌套viewpager
  9. 百度地图 驾车/公交查询Demo(支持多起点多终点)
  10. 【SQL中case then的用法】