题目概述:
给定一个二维数组,要求顺时针对其进行输出。例如给定二维数组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;
}