2011-05-27 26 views
4

假設我們有一個二維陣列arr[N][N],其中Nconstant integer。 假設arr的每個元素都被初始化。C++:以對角方式處理2d陣列元素

如何使用嵌套for循環打印arr反對角線的元素?

我的意思是:最外面的循環的第一次迭代中,arr[0][0]將被打印

    • 之後最外面的循環的第二次迭代後,arr[0][1]arr[1][0]將被打印
    • 經過第三次迭代的最外層循環後,將打印arr[0][2],arr[1][1]arr[2][0]
    • ...
    • 最後一次迭代最後一個循環後,將打印arr[N-1][N-1]

    感謝您的時間!

  • +1

    看起來像功課嗎? :P – evgeny 2011-05-27 09:37:48

    +0

    哈哈這是真的,這種問題的措辭像一個硬件問題,但它實際上不是;) – Demi 2011-05-27 09:41:22

    +2

    JPEG的曲折遍歷? – 2011-05-27 09:41:58

    回答

    3

    對不起大家誰寫的「下半場應該是相似的」 ......這不是。

    總之,在這裏你去:

    // traverse array diagonally 
    int c, tmp, x; 
    for (c = N - 1; c > -N; c--) { 
        tmp = N - abs(c) - 1; 
        x = tmp; 
        while (x >= 0) { 
         if (c >= 0) { 
          std::cout << arr[x][tmp - x] << ", "; 
         } 
         else { 
          std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", "; 
         } 
         --x; 
        } 
        std::cout << "\n"; 
    } 
    

    你需要這個遊戲還是什麼?

    [編輯]再看一遍,我想我的答案寫得不是很好。這裏快速運行:

    讓我們假裝N是3。

    我們需要的是一個迭代上座標組合,看起來像這樣:

    (0, 0) 
    (1, 0), (0, 1) 
    (2, 0), (1, 1), (0, 2) 
    (2, 1), (1, 2) 
    (2, 2) 
    

    所以第一部分的佔位符:

    int c, // a counter, set by the outer loop 
        tmp, // for intermediate results 
        x; // the x-index into *arr* (*y* will be defined implicitly) 
    

    現在這個外環

    for (c = N - 1; c > -N; c--) { 
    

    品牌c迭代{2,1,0,-1,2}

    下一步

    tmp = N - abs(c) - 1; 
        x = tmp; 
    

    接通{2,1,0,-1,-2}{0,1,2,1,0},它們的長度這一步所需的輸出減1(因此它們可以用作索引)。我們製作了兩份,tmpx

    現在我們指望從X到:

    while (x >= 0) { 
         ... 
         --x; 
        } 
    

    如果我們對ARR左上半部,由C> = 0中,x表示-indices into arr需要從對角線開始並下降到零(0到0,1到0和2到0),而y指數需要從零開始並上到對角線(0到0,0到1和0〜2)

     if (c >= 0) { 
          std::cout << arr[x][tmp - x] << ", "; 
         } 
    

    一次我們是在右下半,在x指數需要開始在ñ和向下對角線(2比1和2 2),而Y型指數需要開始在對角線上去N(1至2和2比2)

     else { 
          std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", "; 
         } 
    

    最後,我們只需要在一個換行符每行末尾:

    std::cout << "\n"; 
    

    Savy? :-)

    +0

    謝謝你給我一個完整的答案;)。我需要這樣做,因爲存在嵌套的for循環,因爲數據依賴性,所以無法按行或按列進行並行化,因此只能按照反對角方式進行。 – Demi 2011-06-03 04:35:48

    +0

    好嗎?聽起來很可怕:-) 那麼,如果它適合你,你可以點擊'接受'嗎?謝謝!! :-) – HumanCatfood 2011-06-03 11:40:31

    2

    這將一半的矩陣工作..而另一半將是類似的:

    for (j = 0 ; j < N ; j++) 
    { 
        for (i = 0 ; i <= j ; i ++) 
        { 
         printf("%d \n",a[i,j-i]); 
        } 
    } 
    
    1

    這裏是Java代碼片斷,但算法中是一樣的

    for(int i = 0; i < 10; i++){ 
        for(int j = 0; j <= i; j++){ 
         System.out.print(a[j][i-j] + " "); 
        } 
        System.out.println(); 
    } 
    
    2

    你可以請注意,對於任何對角線,2個「相鄰」元素由[x][y][x+1][y-1]給出:也就是說,您向右和向上採取對角線步驟。

    所以你可以有一個循環來設置對角線的第一個單元格。您只需遍歷y的所有值,從[0][y]開始,然後執行此右上步驟(對角線),直到您碰到頂側或右側。然後你需要從[0][N-1]轉到[N-1][N-1]來覆蓋下半場。

    代碼如下:

    for (int _y = 0; _y < N; _y++) { 
        int x = 0, y = _y; 
        while (x < N && y >= 0) { 
         cout << arr[x][y]; 
         x++; y--; 
        } 
    
        cout << endl; // don't forget a newline 
    } 
    

    我要離開了代碼的下半年,因爲它應該是差不多的。

    +0

    +1解釋,儘管我更喜歡其他答案中的代碼 – 2011-05-27 12:05:55

    1

    看起來是這樣的:

    for(row = 0; row < N; row++){ 
        for(j = 0; j <= row; j++){ 
         print Array[row - j][j]; 
        } 
        newline; 
    } 
    
    1

    下面是矩陣的兩半的解決方案:

    //First half (including middle diagonal) 
        for (int i = 0; i < n; i++) { 
         for (int j = 0; j <= i; j++) { 
          print array[j][i - j]; 
         } 
         newline; 
        } 
    
        //Second half (excluding middle diagonal) 
        for (int i = n - 1; i >= 0; i--) { 
         for (int j = 0; j < i; j++) { 
          print array[n - i + j][n - j - 1]; 
         } 
         newline; 
        } 
    
    0

    這裏是一個解決方案,我認爲它有用 R是行的總數。

    void diagonalOrder(int arr[][COLS],int R) 
        { 
    
         for (int i = 0; i < R+COLS-1; i++) 
         { 
          int col; 
          int row; 
          i<COLS?col=i:col=(COLS-1); 
          col>i?row=col-i:row=i-col; 
    
          for(int j=col;j>=0 ;j--) 
          { 
           if(row<R) 
            cout<<arr[row][j]<<" "; 
           row++; 
          } 
          cout<<endl; 
         } 
        } 
    
    ie. 
    const int ROWS = 4; 
    const int COLS = 3; 
    
    int arr[][COLS] = {{ 1, 2, 4 }, 
             { 3, 5, 7}, 
             { 6, 8, 10}, 
             { 9, 11, 12} 
            }; 
        diagonalOrder(arr,ROWS); 
    
    Output 
    ---------- 
    1 
    2 3 
    4 5 6 
    7 8 9 
    10 11 
    12 
    
    ------------------------------------------------------ 
    const int ROWS = 8; 
    const int COLS = 3; 
    
        int arr8[][COLS] = {{ 1, 2, 4 }, 
             { 3, 5, 7 }, 
             { 6, 8, 10 }, 
             { 9, 11, 13 }, 
             { 12, 14, 16}, 
             { 15 ,17, 19}, 
             { 18 ,20, 22}, 
             { 21, 23, 24} 
    
            }; 
    
        cout<<"\n\n8*3 Matrix"<<endl<<endl; 
        diagonalOrder(arr8,8); 
    
    -------------------------------------------------------------- 
    Output 
    -------------------------------------------------------------- 
    1 
    2 3 
    4 5 6 
    7 8 9 
    10 11 12 
    13 14 15 
    16 17 18 
    19 20 21 
    22 23 
    24 
    ----------------------------------------- 
    
        int arr[][COLS] = {{ 1, 2, 4 ,20}, 
             { 3, 5, 7,20}, 
             { 6, 8, 10,20}, 
             { 9, 11, 12,20} 
            }; 
    ------------------------------------------------------------- 
    Output 
    ------------------------------------------------------------- 
    
    1 
    2 3 
    4 5 6 
    20 7 8 9 
    20 10 11 
    20 12 
    20 
    
    
    You can work with n*n Matrix ..