部分文字摘自《程序员面试题精选100题(51)-顺时针打印矩阵 》
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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。
对于该题,作者举例两个就得出 “让循环继续的条件是columns > startX * 2 && rows > startY * 2。”,实在不是能够理解。所以参考评论中的解答,写出如下代码。
请重点关注二维数组作为参数的传递问题,参考《C++中用二维数组传参时形参该怎样写》。
稍微关注下二维数组的赋值初始化问题。哈哈。
/*
* =====================================================================================
*
* Filename: PrintMatrix.c
*
* Description:
*
* Version: 1.0
* Created: 08/22/2011 01:29:46 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
void PrintMatric(int **arrary,int row,int column)
{
enum TurnDirection{Right,Down,Left,Up};
enum TurnDirection direction = Right;
int left = 0,
right=row;
int up = 0,
down = column;
int i=0,
j=0;
while((left < right)&&(up< down))
{
switch(direction)
{
case Right:
{
//打印横行
for(i = left; i < right; ++i)
printf("%d\t",*((int *)arrary+row * j + i));
//记录此时的Column
--i;
++up;
break;
}
case Down:
{
//打印右侧行
for(j = up; j < down; ++j)
printf("%d\t",*((int *)arrary+row * j + i));
--j;
--right;
break;
}
case Left:
{
for(i = right-1;i >=left; --i )
printf("%d\t",*((int *)arrary+row * j + i));
++i;
--down;
break;
}
case Up:
{
for(j = down; j >=up; --j)
//printf("%d\t",arrary[i][j]);
printf("%d\t",*((int *)arrary+row * j + i));
++j;
++left;
break;
}
}
direction = (++direction )%4;
}
printf("\n\n");
}
int main()
{
int matrix[5][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25},
};
int i,j;
for(i = 0; i < 5; ++i)
for(j = 0 ; j < 5 ; ++j)
printf("%d\t",matrix[i][j]);
printf("\n");
PrintMatric((int **)matrix,5,5);
//
return 0;
}