Obracanie tablicy o jeden krok

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:


#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

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:

tablica 4x4 [1][3] == tablica 1x16 [row * rowSize + column] = [7]
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


#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;
}

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.

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.

0

Btw, zapodaj mu do testów takie tablice:

    //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

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