题:

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

  假如输入如下矩阵:

             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<
<<" "; } //从上到下打印:终止行号>起始行号 if(endx > start) { for(i=start+1;i<=endx;i++) { int num = p[i][endy]; cout<
<<" "; } } //从右到左打印:终止行号>起始行号&&终止列号
<起始列号 if(endx >
 start && endy > start) { for(i=endy-1;i>=start;i--) { int num = p[endx][i]; cout<
<<" "; } } //从下到上打印:满足3行2列 if(endx-start+1>=3 && endy-start+1>=2) { for(i=endx-1;i>start;i--) { int num = p[i][start]; cout<
<<" "; } }}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<

测试结果: