1. 描述
给定一方阵,顺时针打印方阵的值,如方阵:
1, 2, 3, 4
5, 6, 7, 8
9,10,11,12
13,14,15,16
则打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
2. 思路
从外到内每一次打印有4条边组成的方框,如
(1)第一条边1,2,3
(2)第二条边4,8,12
(3)第三条边16,15,14
(4)第四条边13,9,5
代码如下:
void printMatrixClockwise(int n, int matrix[][n]) //n行n列,矩阵matrix下标从0开始
{
int i, j;
for (i = 0; i < n - (n >> 1); i++)
{
for (j = i; j < n - i - 1; j++) //第一条边
printf("%d ", matrix[i][j]);
if ((n & 1) == 0 || i != n - (n >> 1) - 1) printf("\n");
for (j = i; j < n - i - 1; j++) //第二条边
printf("%d ", matrix[j][n - i - 1]);
if ((n & 1) == 0 || i != n - (n >> 1) - 1) printf("\n");
for (j = n - i - 1; j > i; j--) //第三条边
printf("%d ", matrix[n - i - 1][j]);
if ((n & 1) == 0 || i != n - (n >> 1) - 1) printf("\n");
for (j = n - i - 1; j > i; j--) //第四条边
printf("%d ", matrix[j][i]);
if ((n & 1) == 0 || i != n - (n >> 1) - 1) printf("\n");
}
if (n & 1) //如果n是奇数的时候,最中间的那个元素在上面的循环中打印不出来
printf("%d\n", matrix[n >> 1][n >> 1]);
}
测试如下:
#include <stdio.h>
void printMatrixClockwise(int n, int matrx[][n]);
int main(void)
{
int matrix[5][5] = {1, 2, 3, 4, 0,
5, 6, 7, 8, 0,
9, 10, 11, 12, 0,
13, 14, 15, 16, 0,
17, 18, 19, 20, 21,
};
int matrix2[4][4] = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16,
};
int n = 5, n2 = 4;
printf("matrix:\n");
printMatrixClockwise(n, matrix);
printf("matrix2:\n");
printMatrixClockwise(n2, matrix2);
return 0;
}
输出:
当矩阵的行数与列数不相等是也是类似的。