很早就看到這道題了,但是我是一個患有拖延癌的人。有個朋友經常開玩笑,總有一天你會錯過你的婚禮。
今天上午去自習室認真思考了一個小時,認真把邏輯理順了。在草稿紙上把基本代碼寫了一道,回來驗證成功了,開心。
首先,打印矩陣,分圈數打印,判斷需要打印幾圈。
由於矩陣的對稱性,矩陣是用一個二維數組存儲的。所以矩陣的維數除以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>>沒想到差不多的,好開心。
終於寫完了,超級累,洗洗睡了,面膜白敷了,哈哈哈。