Sprawdzenie o ile znaków przesunięta została zawartość tablicy

0

Witam mam taki problem bo mam sprawdzić o ile została przesunięta druga tablica charów i napisałem o taki program który działa jedynie dla pierwszego i trzeciego testu z wiadomych przyczyn. Jakaś wskazówka , pomysł jak to zrobić ? Jeszcze zamieszczam testy żeby było wiadomo w czym mój błąd. Wiem, dlaczego to nie działa , pytam jedynie o jakąś wskazówkę jak to zrobić.
Wejście: liczby oznaczają liczbę kolejno wierszy , kolumn. Algorytm ma sprawdzić ile najmniej ruchów trzeba wykonać do przesunięcia pierwszej tablicy charów w drugą.

4 6
xooooo
oooooo
oooooo
oooooo
------
oooooo
oooooo
oxoooo
oooooo

Wyjście: 3.

Wejście:

3 8
aaaaaaaa
bbbbbbbb
cccccccc
--------
bbbbbbbb
cccccccc
aaaaaaaa

Wyjście : 2.

Wejście:

2 8
neseyolo
ettiswag
------
swagetti
yolonese

Wyjście : 5.

Wyjście oznacza najmniejszą możliwą liczbę przesunięć tablicy.

#include<iostream>
using namespace std;
int main()
{ int n,m,wynik=0;
char tab[502][503];
char x;
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>tab[i][j];
for(int i=0;i<m;i++)
cin>>x;
char tap[503][502];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>tap[i][j];
 
for (int i=0;i<n;i++)
for (int j=0;j<m;j++){
if(tab[0][0]==tap[i][j])
wynik+=i+j;
}
cout<<wynik; 
 
}

Dzięki z góry za podpowiedź. ;)

0

Ale o jakie przesunięcia chodzi? O przesuwanie wierszy i kolumn czy o co? Zrozum ze my NIE ZNAMY TREŚCI ZADANIA. Dlatego dla nas:

działa jedynie dla pierwszego i trzeciego testu z wiadomych przyczyn

te przyczyny nie są wcale takie wiadome i oczywiste...

0

Stasiek ma tablicę o wymiarach n m wypełnioną małymi literami alfabetu angielskiego. Tablicę można
obracać na dwa sposoby: obrót w pionie powoduje przeniesienie ostatniego wiersza przed pierwszy, zaś obrót
w poziomie powoduje przeniesienie ostatniej kolumny przed pierwszą. Stasiek chciałby przy pomocy obrotów
przekształcić swoją tablicę w inną, którą zobaczył w Internecie. Ile najmniej ruchów będzie musiał wykonać?
Wejście
W pierwszym wierszu standardowego wejścia znajdują się dwie liczby całkowite n oraz m (1 6 n; m 6 500).
W każdym z kolejnych n wierszy znajduje się ciąg m małych liter alfabetu angielskiego – jest to opis tablicy
Staśka. Następny wiersz zawiera m znaków ’-’, żeby testy przykładowe ładnie wyglądały. Kolejne n wierszy
zawiera opis tablicy, którą Stasiek zobaczył w Internecie.
Wyjście
W pierwszym wierszu standardowego wyjścia należy wypisać najmniejszą liczbę obrotów, jaką będzie musiał
wykonać Stasiek.

Tak chodzi o jak najmniejsze przesunięcie kolumn i wierszy.
Mój błąd polega na tym, że sprawdzam 1 lepszy znak i o ile wierszy i kolumn sie zmienił a działa tylko dla pierwszego i trzeciego testu bo ta litera występuje tylko raz. A w drugim już nie jest tak łatwo.

0

Ty tak poważnie?

Tablicę można obracać na dwa sposoby: obrót w pionie powoduje przeniesienie ostatniego wiersza przed pierwszy, zaś obrót w poziomie powoduje przeniesienie ostatniej kolumny przed pierwszą

Mieliśmy się tego domyslić? o_O Brak mi słów.

0

Przepraszam , pierwszy raz pisze na jakimś forum nie domyśliłem się. Jak już się poprawiłem i podałem zadanie to chyba nie problem żeby ktoś pomógł.

1

Zacznij od sposobu brutal-force (zawsze od niego zaczynaj jeżeli nie masz pomysłu) w trakcie jego pisania raczej wpadniesz na jakiś pomysł lepszy.
Czyli musisz zrealizować trzy funkcji.

  1. obrót w pionie
  2. obrót w poziomie
  3. porównanie dwóch tablic.

Lepsza wersja zliczasz występowanie znaków.
Ustalasz listę wariantów przesunięć - wszystkie możliwe.
Dla każdego znaku poczynając od najrzadszego, skracasz listę wariantów przesunięć wg występowania tego znaku.
Wybierasz z listy wariantów przesunięć najtańszy (o ile jeszcze jakiś został).

struct _TB
  {
   char ch;
   unsigned y,x;
   _TB *next;
  } tb[500*500];
0

jak sprawdzić liczbę wszystkich możliwych wariantów przesunięć?

0

Y*X-1

0

Ustalasz listę wariantów przesunięć - wszystkie możliwe.
Dla każdego znaku poczynając od najrzadszego, skracasz listę wariantów przesunięć wg występowania tego znaku.
Wybierasz z listy wariantów przesunięć najtańszy (o ile jeszcze jakiś został).

Mam zliczone znaki w obydwu tablicach. I jak mam teraz ustalić listę wariantów przesunięć ( każdego znaku ? ) i jak mam skrócić tą listę?

#include<iostream>
#include<cstdlib>
using namespace std;
char tab1[500][500];
char tab2[500][500];
int zlicz1[500];
int zlicz2[500];
char x;
int main()
{
    int n,m;
    
		
    		cin>>n>>m; // wczytanie kolejno wierszy i kolumn.
    
    		for(int i=0 ; i<n ; i++)
    			for(int j=0 ; j<m ; j++)	// wczytywanie pierwszej tablicy.
    				cin >> tab1[i][j];
    		
    	for(int i=0 ; i<m;i++)	// wczytywanie odstępu między tablicami.
       				cin >> x;
       		
       		for(int i=0 ; i<n ; i++)
    			for(int j=0 ; j<m ; j++) // wczytywanie drugiej tablicy.
    				cin >> tab2[i][j];
   	
   			for(int i=0 ; i<n ; i++)
    			for(int j=0 ; j<m ; j++)	// zliczanie elementów pierwszej tablicy.
			   		zlicz1[tab1[i][j]]++;
   							
   			for(int i=0 ; i<n ; i++)
    			for(int j=0 ; j<m ; j++)	// zliczanie elementów drugiej tablicy.
			   		zlicz2[tab2[i][j]]++;
   				 
0
  1. Zliczaj do jednej tablicy po czym posortuj wg występowania.
  2. Nigdy nie używaj cos++ zawsze zamiast tego używaj ++cos, przynajmniej dopóki nie załapiesz różnicy.
  3. zlicz1[tab1[i][j]]++; wyłazisz poza zakres, char ma zakres od -128 do 127

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