2010-01-21 11 views

cevap

22

Bunu yazmayı hatırlıyorum.

#include <stdio.h> 

int main() 
{ 
    int x[3][4] = { 1, 2, 3, 4, 
        5, 6, 7, 8, 
        9, 10, 11, 12}; 
    int m = 3; 
    int n = 4; 
    for (int slice = 0; slice < m + n - 1; ++slice) { 
     printf("Slice %d: ", slice); 
     int z1 = slice < n ? 0 : slice - n + 1; 
     int z2 = slice < m ? 0 : slice - m + 1; 
     for (int j = slice - z2; j >= z1; --j) { 
       printf("%d ", x[j][slice - j]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

Çıktı:

Slice 0: 1 
Slice 1: 5 2 
Slice 2: 9 6 3 
Slice 3: 10 7 4 
Slice 4: 11 8 
Slice 5: 12 

kısaca nasıl çalıştığını açıklamak için, her dilim bir köşegen olduğunu sana birkaç küçük değişiklik ve anlaşılmaz saçma bir daha hatta ihtiyacı olur dikdörtgen matris için düşünüyorum İlk sütundan başlayarak, diyagonal olarak sağa ve ilk sıranın sonuna doğru ilerler (orijinal olarak aşağı-sol, ancak şimdi posterden bir yorumun sonucu olarak değiştirilmiştir).

z2, ilk numara basılmadan önce kaç öğenin atlanması gerektiğini belirtir. Bu, ilk m dilimleri için sıfırdır ve sonra kalan her dilim için bir artar. z1 sonunda kaç tane öğe atlanmalı, yine ilk m dilimleri için sıfırdan başlayıp, kalan dilimler için bir artar.

+0

Evet, istediğim buydu. Ama ... Aslında ihtiyacım olan şey, ANTI-Diagonal şeritlerde Traverse Dikdörtgen Matriks. :) Karekök matrisi için verdiğiniz cevapta indeksleri değiştirmeyi denedim ve aynı prensibi burada uygulayabileceğimi düşündüm - sadece indeksleri değiştirmek ve anti-diyagonal geçişi elde etmek için. Ancak, dikdörtgen matris için işe yaramaz. Yani şimdi ANTI-diyagonal dikdörtgen traversal için bir soru daha sormalıyım ??? Cevabınız için teşekkürler :) – misaizdaleka

+1

Anti-diyagonal ile ne demek istediğinden emin değilim. Sorunuzu güncellemek yardımcı olacaktır. Yapmanız gereken şey, dizi değerlerini okuduğunuzda x değişmezken y koordinatlarını çevirmek, x yerine x [m - j - 1] [dilim - j] 'ye çevirmek, x [j] [dilim -] j] '. Bu [9], [10,5], [11,6,1] vb. Verir. İstediğiniz bu mu? –

+0

Üzgünüm, yine hatam ... Keskin değildim. Hayır, aynı geçişe ihtiyacım var, ama [1], [2,5], [3,6,9] gibi değil, [1], [5,2], [9,6,3] gibi, vb tekrar teşekkürler. – misaizdaleka