zigzag相關題目

2021-07-12 01:35:01 字數 1503 閱讀 2202

題目:輸入n 求乙個n*n的矩陣,規定矩陣沿45度角線遞增,

形成乙個zigzag陣列,請問如何用c++實現

如圖:please input the number!80 

1 5 

6 14 

15 27 

282 

4 7 

13 16 

26 29 

423 

8 12 

17 25 

30 41 

439 

11 18 

24 31 

40 44 

5310 

19 23 

32 39 

45 52 

5420 

22 33 

38 46 

51 55 

6021 

34 37 

47 50 

56 59 

6135 

36 48 

49 57 

58 62 

63分析:

(1)發現矩陣上三角和下三角的和為n^2-1,即a[i][j]+a[n-i-1][n-j-1]=n^2-1,所以只要計算出上三角就可以推出下三角的值了。

(2)在上三角中,位於同一條斜線的數的橫座標和縱座標加起來都相等。比如1(座標為(1,0)),2(座標為(0,1)),橫座標和縱座標加起來都為1,同理3、4、5的座標和相等。記s=i+j表示橫縱座標和。同時可以發現,座標和為s的數共有s+1個:

s=0   0

s=1   1  2

s=2   3  4  5

....

當座標和為s時,前面共有1+2+...+(s)=s*(s+1)/2個數。

那麼在s這個斜線中,數是如何分布的呢?

這個根據s是奇偶數有所不同,當s%2==0時,斜線中的數從上到下遞減,所以a[i][j]=s*(s+1)/2+j,否則,a[i][j]=s*(s+1)+i。

下面是具體**:

#include "stdafx.h"

#include#includeusing namespace std;

int main()

}} for (i = 0; i < n; ++i)

}squa = n*n;

for (i = 1; i < n; ++i)

}for (i = 0; i < n; ++i)

return 0;

}

另一種實現:

#include "stdafx.h"

#include#includeusing namespace std;

int main()

} }squa = n*n;

for (i = 0; i < n; ++i)

else

}} for (i = 0; i < n; ++i)

return 0;

}

參考:

zigzag壓縮演算法

前文 base 128 varints 編碼 壓縮演算法 介紹了base 128 varints這種對數字傳輸的編碼,了解到了這種編碼方式是為了最大程度壓縮數字的。但是,在前文裡,我們只談論到了正數的情況,那如果出現了負數,該怎麼辦?zigzag壓縮演算法解決的就是這個問題。在聊這個演算法之前,我們...

zigzag遍歷矩陣

按之字型遍歷乙個矩陣。之字形遍歷順序如下圖所示 處理乙個二維矩陣一定不能陷入繁瑣的細節處理中,如果此題思考方向為到了 2 後如何轉向 5,到了 5 後如何轉向 9,到了 9 後又如何轉向 6,這樣程式設計會變得異常複雜。應該抽象出子過程,本題的子過程就是遍歷矩陣斜著的一行,只不過每隔一行遍歷方向改變...

HaiLanXin 相關題目

1.指標和引用的區別 指標指向一塊記憶體,它的內容是所指記憶體的位址 而引用則是某塊記憶體的別名,引用不改變指向。參考 2.c 的空類有哪些成員函式 答 c 的空類有哪些成員函式 預設建構函式。預設拷貝建構函式。預設析構函式。預設賦值運算子。預設取址運算子。預設取址運算子 const。注意 有些書上...