Obracanie tablicy o jeden krok

Obracanie tablicy o jeden krok
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0

Witam,

jak można obrócić tablicę w lewo o jeden krok i tylko po obwodzie?

Wiem jak obrócić o 90 stopni ale jak przesunąć o jedną komórkę nie wiem :-(

dla danych wejściowych:
4 5 // liczba kolumn i wierszy
1 2 3 4
5 6 7 8
9 0 0 9
1 2 3 1
1 2 3 2

Dane wyjściowe:
2 3 4 8
1 6 7 9
5 0 0 1
9 2 3 2
1 1 2 3

Obrót o 90 stopni mam tak:

Kopiuj

#include <iostream>
using namespace std;

int maxp = 100;
int main()
{
int m, n,i,j;
char P[maxp][maxp];
cin >> n >> m; // liczba wierszy i kolumn

for( i = 0; i < n; i++ ) // wczytywanie
{
    for( j = 0; j < m; j++ )
    {
        cin >> P[ i ][ j ];
    }
}
for( i = 0; i < m; ++i ) { // wypisywanie
    for( j = 0; j < n; ++j ) {
        cout << P[ j ][ m - i - 1  ] ;
    }
    cout << "\n";
}

return 0;
}

dla 90 stopni:
wejściowe:
3 3
qqq
eee
ddd

wyjściowe:
qed
qed
qed

edytowany 3x, ostatnio: pattom
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Warszawa
  • Postów:1454
3

Zwróć uwagę Bracie, że całość rozbija się na kroki:

  • przesunąć wiersz 0 o 1 w lewo; przy czym uwaga, wartość będącą na indeksie [0][0] warto by sobie na początku zapisać gdzieś na boku aby nie zginęła
  • przesunąć dane w kolumnie 0 o 1 w dół, tutaj znów uwaga aby aktualną wartość z indeksu [maxRow - 1][0] zapisać sobie na boku, a po przesunięciu pod indeks [1][0] zapisać zapamiętaną na boku wartość z poprzedniego kroku jaka się znajdowała pod [0][0]
  • przesunąć dane w ostatnim wierszu o 1 w prawo, jak zwykle daną będącą na pozycji [maxRow -1[maxColumn - 1] zapamiętać na później, a po zakończeniu przesunięcia pod [maxRow - 1][1] zapisać zapamiętaną na boku wartość z poprzedniego kroku
  • przesunąć dane w ostatniej kolumnie o 1 w górę, a po zakończeniu pod indeksem [maxRow - 2][maxColumn - 1] zapisać zapamiętaną uprzednio wartość
  • testowanie - polecam sprawdzić poprawność działania dla tablicy 2x2, bo w takiej najprędzej odkryjesz nieprawidłową implementację.

Co może Ci się jeszcze przydać Bracie - wiedza, że tablica NxM w pamięci jest równoważna jednowymiarowej tablicy o wielkości N * M, w której kolejne wiersze ułożone są sekwencyjnie po sobie. Czyli dla przykładu:

Kopiuj
tablica 4x4 [1][3] == tablica 1x16 [row * rowSize + column] = [7]

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 5x, ostatnio: MasterBLB
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0

Mam taki kod i działa ale sprawdzaczka go nie przepuszcza :-(
Może ktoś widzi błąd ?
Link do zadania: http://solve.edu.pl/contests/download_desc/1940

Kopiuj

#include <iostream>
using namespace std;
 
int maxp = 100;
int main()
{
int liczbaWierszy, liczbaKolumn;
int P[maxp][maxp];
cin >> liczbaKolumn >> liczbaWierszy; // liczba wierszy i kolumn
 
for( int i = 0; i < liczbaWierszy; i++ ) // wczytywanie
{
    for( int j = 0; j < liczbaKolumn; j++ )
    {
        cin >> P[ i ][ j ];
    }
}

int wedrujacaLiczba = P[0][0];

// krawędz lewa
for( int i = 1; i < liczbaWierszy; ++i ) { // wypisywanie
	int buffor = P[ i ][ 0 ];    
	P[ i ][ 0 ] = wedrujacaLiczba;
	wedrujacaLiczba = buffor;
}
//krawedz dolna
for( int i = 1; i < liczbaKolumn; ++i ) { // wypisywanie
    int buffor =  P[ liczbaWierszy -1 ][ i ];
	P[ liczbaWierszy -1 ][ i ] = wedrujacaLiczba;
	wedrujacaLiczba = buffor;
}

//krawedz prawa
for( int i = liczbaWierszy - 2; i >= 0; --i ) { // wypisywanie
    int buffor = P[ i ][ liczbaKolumn -1 ]; 
	P[ i ][ liczbaKolumn -1 ] = wedrujacaLiczba;
	wedrujacaLiczba = buffor;
}
//krawedz gorna 
for( int i = liczbaKolumn -2; i >= 0 ; --i ) { // wypisywanie
	int buffor = P[ 0 ][ i ] ;    
	P[ 0 ][ i ] = wedrujacaLiczba;
	wedrujacaLiczba = buffor;
}
// wypisz
for( int i = 0; i < liczbaWierszy; ++i ) { // wypisywanie
    for( int j = 0; j < liczbaKolumn; ++j ) {
        cout << P[ i ][ j ] ;
    }
    cout << "\n";
}
return 0;
}

edytowany 1x, ostatnio: pattom
MasterBLB
A gdzie ta sprawdzaczka?
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:83
0
MasterBLB
Uuuu, nie mam uprawnień :/
PA
W kompilatorze śmiga dla różnych testów a tam nie :-(
MasterBLB
A pisze chociaż na czym poległo?
PA
Niestety nie, może trzeba spacje dodać między liczbami przy wypisaniu ?
MasterBLB
E nie, patrz post poniżej.
PA
no i brakowało spacji :-) ale nędza :-) // wypisz for( int i = 0; i < liczbaWierszy; ++i ) { // wypisywanie for( int j = 0; j < liczbaKolumn; ++j ) { cout << P[ i ][ j ] << " " ; } cout << "\n"; }
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Warszawa
  • Postów:1454
0

Ja z nudów też stworzyłem implementację, działa (testowałem 2x2, 3x3, 2x3, 3x2, 4x4, 3x4), i wygląda podobnie do tego co masz Bracie - ale tutaj uwaga, przechowywanie i zapysywanie z powrotem do tabeli tej zmiennej "na boku" należy zrobić poza pętlami.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Warszawa
  • Postów:1454
0

Hmm, jeśli Bracie jesteś imć M. Tometczakiem to po posortowaniu tego edu > status po dacie zgłoszenia pokazuje "błędna odpowiedź", czyli wychodzi na to, iż twój algorytm jednak nie działa. Pamięć OK, czas wykonania OK.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
PA
bez nazwisk proszę :-)
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Warszawa
  • Postów:1454
0

Btw, zapodaj mu do testów takie tablice:

Kopiuj
    //char tab[row][column] = {'1', '2', '3', '4'};// 2x2
    //char tab[row][column] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};// 3x3
    //char tab[row][column] = {'1', '2', '3', '4', '5', '6'};// 2x3 || 3x2
    //char tab[row][column] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};// 3x4 || 4x3
    //char tab[row][column] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};// 4x4

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.