700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 顺/逆时针输出二维数组/矩阵 C语言

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

时间:2021-03-04 16:14:47

相关推荐

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

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

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

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--;}}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。