Poruszanie sie po przekatnych w macierzy


(Lukasz Kryj) #1

Witam

be1726cf57e4d4e3.jpg

Mam tablice (macierz kwadratowa). Chcialbym poruszac sie po przekatnych tak jak na rysunku.

Interesuje mnie przekopiowanie danych z jednej tablicy do drugiej ale poruszajac sie po oznaczonych na czerwono

liniach. Wartosci na rogach moge pominac (czyli: 11,18,81,88). Zaczynam od wiersza 2, kolumna 1 (21), nastepnie

przechodze do wiersza 1, kolumna 2 (12). Pozniej przechodze do wiersza 3, kolumna 1 (31), wiersza 2, kolumna 2 (22),

wiersza 1, kolumna 3 (13) itp. az dojde do glownej przekatnej.

Jak powinna wygladac petla, ktora by wycinala z tabeli takie przekatne ? Moze spotkaliscie sie z algorytmem.


(Fiołek) #2

Jeśli tablica jest kwadratowa, to do zmiennych oznaczających X i Y dodajesz/odejmujesz 1. Np:

[1 2 3]

[4 5 6]

[7 8 9]

Tam gdzie jest "1" to punkt 1,1. Tam gdzie "9" to punkt 3,3. Z punktu "7" do "3" jest to droga 1,3 -> 2,2 -> 3,1 czyli do zmiennej X dodajesz 1 a od Y odejmujesz 1.


(system) #3
void scan(int YSize)

  {

   for(int i=1;i
     {

      for(int k=0;k<=i;++k)

        {

         cout<<"Tb["<<(i-k)<<"]["<<(i+k)<<"]"<
        }

     }

  }

lub cała tablica (nieważne czy XSize równe YSize czy nie:

void scan(unsigned Y,unsigned X)

  {

   unsigned sy=0,sx=0;

   while(sx
     {

      for(int y=sy,x=sx;(y>=0)&&(x
        {

         cout<<"Tb["<
        }

      ++sy;

      if(sy>=Y)

        {

         ++sx;

         sy=Y-1;

        }

     }

  }

jeżeli to zoptymalizować to wyjdzie:

void scan(unsigned Y,unsigned X)

  {

   for(unsigned sy=0,sx=0;sx
     {

      for(int y=sy,x=sx;(y>=0)&&(x
        {

         cout<<"Tb["<
        }

     }

  }

(Lukasz Kryj) #4

Dziekuje za wskazowki i kod. Zabieram sie do pisania :slight_smile: