题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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。
今天中午没有睡午觉,头晕的啊不行。看海涛的递归看了好久没反应,自己思路和他的基本一致,主要的问题就是 边界条件的处理上面有问题。头昏所以先放放。
看到下面一个网友的评论中,采用四个边界来固定遍历,即左边界,右边界,上边界,下边界,无外乎就在这四个边界中移动,如果出现边界重合即退出。
#include "stdio.h"
int main()
{
int upbound,downbound,leftbound,rightbound;
int data[3][3] ={
{1,2,3},
{5,6,7},
{8,9,10},
};
int row,col;
enum dir{right,down,left,up} direction;
row =0;
col =0;
direction = right;
upbound =leftbound =0;
rightbound=3-1;
downbound = 3-1;
while(1)
{
printf("%d ",data[row][col]);
if(direction == right)
{
if(col <rightbound)
{
++col;
}
else
{
if(upbound == downbound)
{
break;
}
++row;
direction = down;
++upbound;
}
}
else if(direction == down)
{
if(row < downbound)
{
++row;
}
else
{
if(leftbound == rightbound)
{
break;
}
--col;
direction = left;
--rightbound;
}
}
else if(direction == left)
{
if(leftbound <col)
{
--col;
}
else
{
if(upbound == downbound)
{
break;
}
--row;
direction = up;
--downbound;
}
}
else if(direction == up)
{
if(upbound <row)
{
--row;
}
else
{
if(leftbound == rightbound)
{
break;
}
++col;
direction = left;
++leftbound;
}
}
}
return 0;
}