c
#include <stdio.h>
// 定义矩阵大小(这里以3x3为例)
#define N 3
void printMatrixClockwisely(int matrix[N][N]) {
int i = 0, j = N - 1;
while (i <= j) {
// 打印第一行元素(从左到右)
for (; i<=j && i<N; ++i) printf("%d ",matrix[i][j]);
if(i>j) break;
// 打印最后一列元素(从上至下)
for(; i<=j && j>=0 ; --j) printf("%d ",matrix[i][j]);
// 如果没有越界且当前层未结束,则继续向内一层移动,并打印其左侧元素
if(j >= 0 && i<N-1){
++i;
--j;
// 打印最左边一列元素(自顶向下)
for(; i<j && j>=0; --j) printf ("%d ",matrix[j][i]);
// 再次检查边界并打印底部的最后一行元素(由左往右)
for(; i<j && i<--N; ++i) printf ("%d ",matrix[j][i]);
}
}
}
int main() {
int example_matrix[N][N]={{1,2,3},{4,5,6},{7,8,9}};
printf("The clockwise order of the elements in the given matrix is:\n");
printMatrixClockwisely(example_matrix);
return 0;
}
这段程序的核心在于`printMatrixClockwisely()`函数的设计与实现:
首先定义两个指针变量 `i` 和 `j` 分别指向每一圈遍历起始位置:即外侧一圈的第一个元素所在行和最后一个元素所在的列。然后按照以下四个步骤循环进行操作直至无法再找到新的元素为止:
1. 遍历“首行”所有剩余元素。
2. 遍历“尾列”的上方部分元素。
3. 若条件满足则开始内部一行的遍历:“末行”的左侧元素向上递减输出。
4. 最后遍历完这一圈内的全部内容之后,“底边列”的下方元素逐个向右侧输出。
通过这种方式,在主函数main调用该方法的时候就可以顺利地对任意给定尺寸为NxN的矩阵按照顺时针对角线方向完成元素的输出了。这个算法的时间复杂度接近于O(N^2),因为它需要访问每一个矩阵中的元素一次。同时空间效率也很高,仅需常数级额外存储即可解决问题。