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

更新时间:2023-05-16 21:29:40 阅读: 评论:0

顺逆时针输出⼆维数组矩阵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 clockwi(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};
clockwi(arr,5,4);
}
逆时针输出(Countercolockwi)
#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 Counterclockwi(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};
Counterclockwi(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] << " ";
}
}
el if (b == d)
{
渣土运输公司
for (int i = a; a >= c; i++)
{
cout << arr[i][b] << " ";
}
}
el
{
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--;
}
添加页眉
}
这样写起来,边界的检测更容易,代码写起来也简单些

本文发布于:2023-05-16 21:29:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/659018.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:打印   坐标   函数   输出   起点   顺时针   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图