程序员面试题精选100题(51)-顺时针打印矩阵

部分文字摘自《程序员面试题精选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;
}

  

            



posted @ 2011-08-22 19:14  westfly  阅读(277)  评论(0编辑  收藏  举报