题:

  输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

  假如输入如下矩阵:

             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


则顺时针打印出的数据为1,2,3,4,5,10,15,20,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13

 

看到此题呢,首先分析有规律嘛?


我们打印此矩阵时,可分为4步:

(1)从左到右打印:满足终止列号>起始列号

(2)从上到下打印:满足终止行号>起始行号

(3)从右到左打印:满足起始列号>终止列号 && 终止行号>起始行号

(4)从下到上打印:满足3行2列


由矩阵可以看出,打印矩阵的最后一圈的起始位置为2*2,可以得出循环的条件为

while(row>start*2 && col>start*2)


得到如上规律,就不难写程序(就5*5为例):

void PrintCircle(int(*p)[5],int rows,int cols,int start)
{
	int endx = rows-start-1;//行号
	int endy = cols-start-1;//列号
	int i = 0;
	//从左往右打印
	for(i=start;i<=endx;i++)
	{
		int num = p[start][i];
		cout<<num<<" ";
	}
	//从上到下打印:终止行号>起始行号
	if(endx > start)
	{
		for(i=start+1;i<=endx;i++)
		{
			int num = p[i][endy];
			cout<<num<<" ";
		}
	}
	//从右到左打印:终止行号>起始行号&&终止列号<起始列号
	if(endx > start && endy > start)
	{
		for(i=endy-1;i>=start;i--)
		{
			int num = p[endx][i];
			cout<<num<<" ";
		}
	}
	//从下到上打印:满足3行2列
	if(endx-start+1>=3 && endy-start+1>=2)
	{
		for(i=endx-1;i>start;i--)
		{
			int num = p[i][start];
			cout<<num<<" ";
		}
	}
}
void PrintMarix(int (*p)[5],int row,int col)
{
	if(p == NULL || row < 0 || col < 0)//矩阵是否合法
	{
		return;
	}
	int start = 0;
	while(row>start*2 && col>start*2)
	{
		PrintCircle(p,row,col,start);//打印矩阵
		start++;
	}
}

测试函数:

void test()
{
	int a[][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};
	PrintMarix(a,5,5);
	cout<<endl;
	return 0;
}

测试结果:

wKioL1ce7TvRD9dIAAAOiMWgtiM117.png