Rotacja tablicy 2D.

0

Witam mam input postaci :
in:
1
2 3
4 5 6
7 8
9
Chcialbym aby na wyjsciu wyswietlila sie macierz postaci:
out.
4 2 1
7 5 3
9 8 6

Probowalem najpierw sczytywac znaki kolejno do tablicy 1D postaci arr = [ 1 2 3 4 5 6 7 8 9 ] i szukac jakiegos wzoru ktorym bede sie odwolywal do odpowiedniej komorki macierzy 2D.
Nastepnie probowalem sczytac kolejno do macierzy 2D bezposrednio i wykonac jakas rotacje na tej macierzy. Jednak zaden sposob nie byl optymalny. Szukam jakis wskazowek badz podpowiedzi w jaki sposob przeksztalcic taki input?

0
4 2 1
7 5 3
9 8 6

Z tej tablicy dokładnie widać w jakiej kolejności trzeba wczytywać elementy do tablicy.

Żeby wczytać dowolną odwróconą tablicę wystarczy musisz wczytywać ukosem do tablicy wynikowej, czyli coś w rodzaju:

  • wczytać pierwszy rząd wyniku, czyli 1
  • wczytać drugi rząd wyniku, czyli 2 3
  • wczytać trzeci rząd wyniku, czyli 4 5 6
  • ...

Zauważ że (przed połową) wczytywanie rzędu n zaczynasz od pozycji x=SZEROKOSC - n - 1 y=0, kończysz na x=SZEROKOSC-1 y=WYSOKOSC - n - 1 oraz zwiększasz x i y o 1 przy każdym kroku (a kroków jest n).
Po przejściu połowy sytuacja jest podobna, tylko z minimalnie innymi parametrami. Poradzisz sobie ;).

Jeśli nie, wklej chociaż kod który obecnie masz, może wystarczy go trochę zmodyfikować.

0

Lekko zmodyfikowalem to co napisales i otrzymalem cos takiego:
Wezmy przykladowy input:

 
      a                        n = 1
    b  c                      n = 2
  d  e  f                     n = 3
g   h   i  j                   n = 4  
  k   l  m                     n = 5
    n  o                       n = 6
      p                        n = 7

Macierz wynikowa poprawna:

 
g d b a
k h e c
n l  i  f
p o m j

Do badania stanu tabliczy tworze dwie zmienne pomocnicze:

int za_polowa = 0;
bool czy_polowa = false; 

Wykonuje kolejno kroki:

  1. n = 1 czy_polowa = false; za_polowa = 0;
    x = SZEROKOSC - n + za_polowa; y = za_polowa; znak = "a";
  2. n = 2 czy_polowa = false; za_polowa = 0;
    x = SZEROKOSC - n + za_polowa; y = za_polowa; znak = "b"; ( mamy teraz k - krokow, gdzie k = n dokladnie 2, a wiec )
    x++; y++; znak = "c";
    ...
  3. n = 4 czy_polowa = false; za_polowa = 0; ( wiem ze jestem w polowie poniewaz n == SZEROKOSC, jednak zmienna czy_polowa zmienie na true dopiero po tym rzedzie )
    dalej analogicznie jak w 1 i 2 gdzie na koncu:
    czy polowa = true;
  4. n = 5 czy_polowa = true; za_polowa++; ( zmienna za polową bedzie teraz zwiekszana o 1 przy kazdym rzedzie );
    x = SZEROKOSC - n + za_polowa; y = za_polowa; znak = "k"; ( mamy teraz k - krokow, gdzie k = --n -1 dokladnie 3, a wiec )
    x++; y++; znak = "l";
    x++; y++; znak = "m";
    ...

Wynik wedlug powyzszych krokow:

 
g d b a
k h e c
n l  i  f
p o m j

Jak widac zgadzaja sie, jakbym gdzies popelnil blad prosze o poprawe, dzieki za pomoc :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1