很早就看到这道题了,但是我是一个患有拖延癌的人。有个朋友经常开玩笑,总有一天你会错过你的婚礼。
今天上午去自习室认真思考了一个小时,认真把逻辑理顺了。在草稿纸上把基本代码写了一道,回来验证成功了,开心。
首先,打印矩阵,分圈数打印,判断需要打印几圈。
由于矩阵的对称性,矩阵是用一个二维数组存储的。所以矩阵的维数除以2,就是需要打印的圈数。
下图是6*6矩阵,所以需要打印3圈。
然后每圈打印的方式都是一样的。
如上图所示这是一个6*6的矩阵。
每圈分成4部分输出,总共分成三圈。
(图中只标明的临界点为第一圈临界点的位置。)
第一部分输出,每圈从最左边上面那个点开始一直打印到每圈最上面最右边的前一个点结束,作为最上面一行。
特点:每圈这一部分行的值不变,列的值在增加,换算成二维数组的就是下标第一个参数不变第二个参数增加。
第一圈从a[0][0]到a[0][4]结束;
第二圈从a[1][1]到a[1][3]结束;
第三圈从a[2][2]到a[2][2]结束(只有一个点为了比较所以写出来)。
打印完n圈row行column列,在打印n+1圈的时候就要把起始点的row和column都+1,所以在打印完第n圈后把row和column都加1.
从开始点开始打印,执行column++操作,结束点的 column都是number-port-2(number表示维度,port表示已经打印了的圈数).
第二部分输出,每圈从最右边上面那个点开始一直打印到每圈最下面最左边的后一行点结束,作为最下面一行。
特点:每圈每一部分列的值不变,行的值在增加,换算成二维数组的就是下标第一个参数不变第二个参数增加。
第一圈从a[0][5]到a[4][5]结束;
第二圈从a[1][4]到a[3][4]结束;
第三圈从a[2][3]到a[2][3]结束(只有一个点为了比较所以写出来)。
由于开始点是第一部分结束点的下一个点,所以开始点(就是当时的a[row][column],因为第一部分每次都执行了column++的)开始打印,
执行row++操作,结束点的row都是number-port-2(number表示维度,port表示已经打印了的圈数).
第三部分输出,每圈从最右边下面那个点开始一直打印到每圈最下面最左边的前一个点结束,作为最下面一行。
特点:每圈这一部分行的值不变,列的值在减小,换算成二维数组的就是下标第一个参数不变第二个参数减小。
第一圈从a[5][5]到a[5][1]结束;
第二圈从a[4][4]到a[4][2]结束;
第三圈从a[3][3]到a[3][3]结束(只有一个点为了比较所以写出来)。
由于开始点是第二部分结束点的下一行的点,所以开始点(就是当时的a[row][column],因为第二部分每次都执行了row++的)开始打印,
执行column--操作,结束点的column都是port+1(port表示已经打印了的圈数).
第四部分输出,每圈从最左边下面那个点开始一直打印到每圈最上面最左边的下一行点结束,作为最下面一行。
特点:每圈这一部分列的值不变,行的值在减小,换算成二维数组的就是下标第二个参数不变第一个参数减小。
第一圈从a[5][0]到a[1][0]结束;
第二圈从a[4][1]到a[2][1]结束;
第三圈从a[3][2]到a[3][2]结束(只有一个点为了比较所以写出来)。
由于开始点是第而部分结束点的前一列的点,所以开始点(就是当时的a[row][column],因为第二部分每次都执行了column--的)开始打印,
执行row--操作,结束点的row都是port+1(port表示已经打印了的圈数).
最后,判断矩阵是奇偶矩阵,存在中间数需要打印。
由于圈数是以number/2作为判断标准,所以当奇数是就忽略了中心点数,判断是奇数后需要单独打印出来。
#include <iostream>
using namespace std;
void Print(int **Array, int number)
{
int count = number/2;
int centre = number%2;
int port =0;
int column = 0;
int row =0;
while (port<count)
{
cout<<"打印第"<<port+1<<"圈"<<endl;
//第一部分
while(column < number-port-1)
{
cout<<Array[row][column]<<" ";
column++;
}
//第二部分
while(row<number-port-1)
{
cout<<Array[row][column]<<" ";
row++;
}
//第三部分
while(column>port)
{
cout<<Array[row][column]<<" ";
column--;
}
//第四部分
while(row>port)
{
cout<<Array[row][column]<<" ";
row--;
}
cout<<endl;
port++;
column++;
row++;
}
//判断奇偶矩阵
if(centre==1)
{
cout<<"打印第"<<port+1<<"圈"<<endl;
cout<<Array[count][count]<<" ";
}
}
int main()
{
cout<<"请输入number"<<endl;
int number;
cin>>number;
int **p;
p = new int*[number];
for(int i=0;i<number;i++)
{
p[i] = new int [number];
}
cout<<"请输入矩阵"<<endl;
for(int j=0;j<number;j++)
{
for(int i=0;i<number;i++)
{
cin>>p[j][i];
}
}
Print(p,number);
system("pause");
return 0;
}
小记:
此代码输入的矩阵为row和column一样的矩阵,row和column不一样的改一下即可。
矩阵为空没判断,需要的请自己添加。
本来写完觉得自己的方法太笨,时间复杂度太高,看了哈<<剑指offer>>没想到差不多的,好开心。
终于写完了,超级累,洗洗睡了,面膜白敷了,哈哈哈。