二维数组顺时针输出(C语言实现)

    xiaoxiao2023-11-16  169

    题目概述:

    给定一个二维数组,要求顺时针对其进行输出。例如给定二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};要求输出结果为:1、2、3、6、9、8、7、4、5。

    题目分析:

    这道题目乍一想似乎很简单,只不过是通过变量控制,输出结果就行。但事实上要实现任意二维数组的顺时针输出,这种方法边不可取。于是自己花了很多时间去思考其求解过程。仔细一想,二维数组实际是一个矩形方阵,是一个平面。而面是由线组成的。再进一步想,一条连续的螺线线不就是一个平面。对,没错,就是这样。我们只需要通过循环从外层开始输出,然后通过变量控制一圈一圈的输出不就好了。如图所示是数组输出的具体过程(不同的颜色表示不同的层)。

    代码实现:

    #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #define N 3 void PrintMatrix(int (*num)[N],int col,int low,int start) { assert(num != NULL); assert(col > 0 && low > 0); int C_end = col-start-1; //计算行最后一个位置的坐标 int L_end = low-start-1; //计算列最后一个位置的坐标 int i = 0; for(i = start;i <= L_end;i++) { printf("%d ",num[start][i]); //从左到右打印行 } if(C_end > start) { //由于从左到右输出完整的一行,故从上到下输出时,从下一行最后位置开始输出 for(i = start+1;i <= C_end;i++) { printf("%d ",num[i][L_end]); //从上到下打印列 } } else {return;} if(L_end > start) { //由于从上到下输出完整的一列,故从右向左打印时,从前一列最后位置开始输出 for(i = L_end - 1;i >= start;i--) { printf("%d ",num[C_end][i]); //从右向左打印行 } } else {return;} //如果从下向上输出时,下一行和上一行的下标差为1,说明这一圈输出完成,不进行从下到上的打印 if(C_end - start != 1) { for(i = C_end-1;i >= start+1;i--) { printf("%d ",num[i][start]); //从下到上打印列 } } else {return;} } void Print_Matrix(int (*num)[N],int col,int low) { if(num == NULL || col <= 0 || low <= 0) { return; } printf("数组顺序针输出结果是:"); int start = 0; while(col > 2 * start && low > 2 * start) //圈数循环 { PrintMatrix(num,col,low,start); start++; } printf("\n"); } int main() { //测试用例: int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; int num1[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; Print_Matrix(num,3,3); Print_Matrix(num1,4,3); return 0; }

    输出结果:

    最新回复(0)