您的位置:首页 > 职场人生

面试题20:顺时针打印矩阵

2016-07-11 12:35 489 查看
1.输入一个矩阵,按照从外到里以顺时针的顺序打印出每一个数字。

例如:



分析:

分析循环打印的规律可以发现,每次打印都是往矩阵的内部缩小了一周,这样的话可以可以用两个坐标点来确定这样一个矩形的左上角顶点和右下角顶点,然后依据两个点确定的范围来打印,按照从左到右,从上到下,从右到左,从下到上的顺序打印。

源码:

/**/
#include<iostream>
using namespace std;
//确定打印的矩形框
void PrintStart(int**a, int row,int col);
//按照四种顺序依次打印
void PrintCircle(int** a, int start,int endX,int endY);
int main()
{
int** numbers = new int*[4];
cout<<"the original matrix :"<<endl;
for(int i = 0; i < 4; ++i)
{
numbers[i] = new int[4];
for(int j = 0; j < 4; ++j)
{
numbers[i][j] = i * 4 + j + 1;
printf("%3d  ",numbers[i][j]);
}
cout<<endl;
}
cout<<"the output is : "<<endl;
PrintStart(numbers,4,4);
system("PAUSE");
return 0;
}
void PrintStart(int** a, int row,int col)
{
int start=0;//左上角位置
int endX=row-1;//右上角位置
int endY=col-1;
while(start<=endX&&start<=endY)//逐步缩小范围
{
PrintCircle(a, start,endX,endY);
start++;
endX--;
endY--;
}
cout<<endl;

}
void PrintCircle(int** a, int start,int endX,int endY)
{
//从左往右打印
for(int i=start;i<endY;i++)//行末尾少打印一个,以免重复
{
cout<<a[start][i]<<"  ";
}
//从上到下打印
for(int i=start;i<endX;i++)
{
cout<<a[i][endY]<<"  ";
}
//从右往左打印
for(int i=endY;i>start;i--)
{
cout<<a[endX][i]<<"  ";
}
//从下往上打印
for(int i=endX;i>start;i--)
{
cout<<a[i][start]<<"  ";
}
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: