Algorytm do zliczenia takich samych sąsiadujących elementów

0

Mam tablicę z liczbami od 1 do 5 dobranymi w sposób losowy. Chcę policzyć i usunąć z niej niektóre liczby. Chodzi o coś takiego:

  • jeżeli sąsiadują ze sobą pionowo lub poziomo (lub tak i tak) minimum:
    • dwie dwójki
    • trzy trójki
    • cztery czwórki
    • pięć piątek

to ma policzyć dla każdej cyfry ilość liczb, które ze sobą sąsiadują i je usunąć. Podam przykład. Mam taką tabelę:

1 2 4 5 1 4 2
1 3 5 5 2 3 1
2 3 3 5 4 4 3
2 1 1 5 4 3 4
1 1 4 4 3 3 2
3 3 3 4 3 1 2
1 2 3 2 2 1 2

to tak, np. piątki są takie:

1 2 4 5 1 4 2
1 3 5 5 2 3 1
2 3 3 5 4 4 3
2 1 1 5 4 3 4
1 1 4 4 3 3 2
3 3 3 4 3 1 2
1 2 3 2 2 1 2

w takim wypadku funkcja ma zwrócić (lub ew. dodać do globalnej liczby punktów) 25 (5 * 5) pkt-ów i wyzerować komórki, które zostały zapunktowane.

tak samo funkcja ma postąpić ze wszystkimi cyframi, we wszystkich wystąpieniach "grup".

jak to zrobić? Nie piszę języka, bo chodzi o sam algorytm. Wydaje mi się, że tutaj przyda się rekurencja, ale na razie nie potrafię wymyślić jak ją napisać. Proszę o pomoć

Pozdrawiam

0

nie potrafię wymyślić jak ją napisać.

Skacz po wszystkich liczbach, wtedy licz ilość sąsiadów tych samych numerów (tutaj się przyda rekurencja) i ich zeruj. W czym problem nie mam pojęcia.

0
-oho123 napisał(a)

tutaj się przyda rekurencja

Owszem, ale do rekurencji trzeba mieć ten kawałek mózgu... :P Jeśli autor ma problem ze zrobieniem tego w jakikolwiek sposób to myślę, że rekurencyjnie tym bardziej tego nie zrobi;

Można to zrobić w dość prosty sposób, ale nie tak krótki jak rekurencyjnie; Jeśli liczby przechowujesz w macierzy dwuwymiarowej to ustaw dwie pętle przechodzące przez każde pole i sprawdzaj w każdym kierunku dla danej cyfry ile jest wystąpień; Jeśli ich ilość jest odpowiednia - dodaj punkty i zeruj pola, które sprawdzałeś; I tak do ostatniego pola;

Jeżeli chcesz to wykonać rekurencyjnie to musisz się trochę dłużej nad tym zastanowić, ale też nie jest to aż tak trudne, że niewykonalne :P

Może Ci się przydać algorytm rozrostu ziarna ze zliczaniem pól, które pasują do wzorca;


Piszesz nową Montezumę? Moja mamuśka by się ucieszyła :P

0

Może:

Leć po wierszach:
Sprawdzaj dwie kolejne pary elementow czy sa == 2, jesli tak to zeruj i dodaj wynik+=2 (6 sprawdzen w petli)
Sprawdzaj trzy kolejne pary elementow czy sa == 3, jesli tak to zeruj i dodaj wynik+=3 (5 sprawdzen w petli)
Leć po kolumnach:
Tak samo jak w wierszach

Łatwa optymalizacja to pominięcie jakiegoś sprawdzenia z racji tego że przy znalezieniu grupy elementy zostaja wyzerowane

Dość prymitywne ale powinno działać jeżeli dobrze zrozumiałem polecenie

0
Joseph666 napisał(a)

Leć po wierszach:
Sprawdzaj dwie kolejne pary elementow czy sa == 2, jesli tak to zeruj i dodaj wynik+=2 (6 sprawdzen w petli)
Sprawdzaj trzy kolejne pary elementow czy sa == 3, jesli tak to zeruj i dodaj wynik+=3 (5 sprawdzen w petli)
Leć po kolumnach:
Tak samo jak w wierszach

No nie wiem; Zwróć uwagę na przykład (trochę bardziej uwidocznina grupa liczb 5):

Fields.png

Jeżeli chcesz sprawdzać liniowo (wiersze, kolumny) to pominiesz na pewno jakieś liczby; Może to i dobry sposób, ale trzebaby go trochę zmodyfikować;

Ja polecam wykorzystać dwie zagnieżdzone pętle i algorytm flood fill dla każdego pola (pomijający oczywiście te wyzerowane pola) w taki sposób:

var
  X, Y: Byte;
begin
  {...}

  for Y := 0 to High(Tablica) do
    for Z := 0 to High(Tablica[Y]) do
      {funkcja rekurencyjnego sprawdzania}

  {...}
end;

Pisane z głowy - mogą błyć błedy; W ten sposób przeskanowane zostanie każde pole, i dla każdego pola zostaną wyzerowane każde grupy liczb pasujące do wzorca (dwie 2, trzy 3, cztery 4, pięć 5);

W tym przykładzie akurat mamy więcej prawidłowych grup:

SolvedFields.png

Jednak aby to wykonać trzeba odpowiednio przygotować funkcję/procedurę rekurencyjną, by sprawdzanie odbywało się dla konkretnej grupy (liczba spod Tablica[X][Y]) liczb oraz pomijało pola wyzerowane;

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