2012-10-13 175 views
0

可能重複:
zig zag scan algorithm打印矩陣

我有這樣的矩陣:

1 2 3 4 5 
6 7 8 9 A 
B C D E F 
0 1 2 3 4 

而且我希望它在一行打印如下:

1 6 2 B 7 3 0 C 8 4 1 D 9 5 2 E A 3 F 4. 

最簡單的方法是怎麼做的?

+2

你是如何保存它?你的代碼是什麼樣的? [你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – jbowes

+0

你的矩陣是如何表示的?請提供一些代碼。 – Xyand

+2

'print mat [0] [0];印花墊[1] [0];打印墊[0] [1];印花墊[2] [0]; ... print mat [3] [4];' – pmg

回答

1

使用嵌套循環。 外環超過(0,0)

內部循環覆蓋i和j的所有有效組合,總和距離。

-1
for(int i = 0; i < matrix.cx; i++) { 
    for(int j = 0; j < matrix.cy; j++) { 
     std::cout << matrix[i][j] << ' '; 
    } 
    // comment following line to make matrix printed in one line 
    std::cout << std::endl; 
} 
+1

我認爲OP需要它以對角方式打印有趣的方式。 – qdot

+0

@qdot:這實際上並不是一種有趣的方式,它是一種常見的鋸齒形掃描模式。 – KillianDS

+0

@qdot:常用在哪裏?我想DCT變換是實踐中唯一使用的地方..整個問題聽起來非常像缺少[作業]標籤。 – qdot

0

如果在陣列基質店這樣的:

#include <stdio.h> 
int main(void) { 
    char matrix[4][5] = {{'1','2','3','4','5'}, 
         {'6','7','8','9','A'}, 
         {'B','C','D','E','F'}, 
         {'0','1','2','3','4'}}; 
    int cols = 5; 
    int rows = 4; 
    int i = 0; 
    for(i = 0; i < cols + rows -2 ; i++){ 
    int j = 0; 
    while(j <= i){ 
     int k = i-j; 
     if(k < rows && j < cols){ 
      printf("%c ",matrix[k][j]); 
     } 
     j++; 
    } 
    } 
} 

我只是從0一直到總行和列的索引的(在這種情況下,從0到7) 總索引的每個值,列和行之和等於當前總索引的打印值,如果索引可用(小於列和行的索引),則打印它,否則轉義。 例如:

0 - 00 
1 - 10 01 
2 - 20 11 02 

順便說一句,好像需要比別人

+0

至少試着解釋你的代碼。 – KillianDS

1
#include <iostream> 

int main(int argc, char **argv) 
{ 
    char m[4][5] = { { '1', '2', '3', '4', '5' }, 
      { '6', '7', '8', '9', 'A' }, 
      { 'B', 'C', 'D', 'E', 'F' }, 
      { '0', '1', '2', '3', '4' } }; 

    for (int i = 0; i <= 3; ++i) { 
     for (int j = 0; j <= i; ++j) { 
      std::cout << m[i - j][j] << " "; 
     } 
    } 

    for (int i = 4; i <= 7; ++i) { 
     for (int j = i - 3; j <= 4; ++j) { 
      std::cout << m[i - j][j] << " "; 
     } 
    } 

    std::cout << std::endl; 
    return 0; 
} 
0

更多的循環(如果我假設你存儲字符在每個小區)我會建議爲矩陣vector<vector<char> >表示。一個重要的觀察結果是,對於每個對角線,i和j指數的總和爲常數,對於對角線,這個總和增加1。

注意到這一點後,您在x座標上的和和內循環上進行外循環。注意不要掉出矩陣! 現在最簡單的C++的方法來打印矩陣將是:

vector<vector<char> > a; 
for(unsigned sum = 0; sum < a.size() + a[0].size(); ++sum) { 
    for (unsigned j = 0; j <= sum && j < a[0].size(); ++j) { 
    unsigned i = sum - j; 
    if (i >= a.size()) { 
     continue; 
    } 
    cout << a[i][j] << " "; 
    } 
} 

人們可以通過改變起始值(這樣繼續的條件是不正確的),優化了j中的週期,但代碼將是更難理解。另一個我沒有解決的問題是即使在最後一個元素之後仍然會打印一個空白。這是另一個需要添加的檢查。

希望這會有所幫助。