题:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
假如输入如下矩阵:
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;
}
测试结果:
转载于:https://blog.51cto.com/10810429/1767820