Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem programistyczny. Wypełnianie podłogi płytkami
Forum PHP.pl > Inne > Hydepark
marcinpruciak
Mam zadanie wypełnić przestrzeń takimi 3 rodzajami rombów:


Mają być ułożone losowo, z warunkiem że nie mogą się nakładać.
Z rombem 1 i 2 nie mam problemu. Losuję sobie normalnie to w tablicy dwuwymiarowej i wklejam obrazek:
demo

Z rombem nr 3 mam spory problem, ponieważ zajmuje dwa miejsca poziomo i pionowo (chyba). W normalnej tablicy nie da się go chyba zapisać? Jakiś pomysł?
thek
Potraktuj owe romby jako złożone z 4 trójkątów. W 1 i 2 są one obok siebie. Różnica to fakt, który może być początkowy. W 3 dwa są obok siebie, a następne 2 poniżej tych dwóch. Kwestia najważniejsza to jak zapisać "podłogę" w takim układzie winksmiley.jpg Najprościej... Górne trójkąty to indeksy 0, 2, 4,...(parzyste). 1,3,.. (nieparzyste) to dolne. Tak tworzysz wiersz. Kolejny ma indeksy przesunięte o 1, czyli górne stają się nieparzystymi a dolne parzystymi. Trudność sprawia wyłapanie, który jest którym w jakim wierszu i tyle winksmiley.jpg Przyjmując że wiersz zerowy ma najpierw górny trójkąt, wiersz pierwszy będzie miał pierwszy trójkąt dolny ()stworzy to ich lustrzane odbicie konieczne do rombu nr 3).
Przykład dla płytki 1, to zajęcie od nieparzystej 4 kolejnych czyli przykładowo 3,4,5,6
Przykład dla płytki 2, to zajęcie od parzystej 4 kolejnych, czyli przykładowo 4,5,6,7
Przykład dla płytki 3, to zajęcie sąsiednich nieparzystego i parzystego (5 i 6) w wierszu 0 oraz 5 i 5 w wierszu 1

To cały trick winksmiley.jpg Później tylko musisz sprawdzać, czy da się wklejając romby zajmować określone elementy podłogi (wykraczanie poza "podłogę" lub zachodzenie na inne płytki).
marcinpruciak
Nie wiem czy dobrze rozumiem to co zrozumiałeś.
Ale zadaniem nie jest wypełnienie całej podłogi, tylko rozrzucenie płytek, mogą powstać dziury, które później mam wyłapać.
Nie można ich ciąć ani obracać.
hwao


Warunek na:
1: [x,y][x,y+1]
2: [x,y][[x,y+1] (jak ponumerujesz indeksy inaczej to po prostu w pierwszym x będziesz miał parzyste, a w 2gim nie i tak poznasz który to)
3: [x,y][x+1,y] (zależy jak przyjmiesz "krawędź" i musisz pamiętać dodatkowo a sprawdzeniu czy [y] jest parzyste dla obu, (zależy od indeksów w tablicy))

Teraz sobie tylko losujesz i sprawdzasz tym warunkiem czy masz wolne te pola, jak tak to wstawiasz, jak nie to już któreś zajmuje.
thek
To co zrobił hwao wygląda ok, a ja pokażę wariant mojego powyżej, który jest nieco bardziej oszczędny co do miejsca smile.gif

Zakładając, że całą podłogę możesz zapisać jak chcesz, to potnij ją na prostokąty o krótszym boku równym połowie długości boku rombu i przekątnej o dokładnie tej długości oraz zaznacz obie przekątne. Powstanie Ci bazowy kafel składający się z 4 trójkątów. Oznacz je sobie jakoś od 1 do 4 i teraz ułóż sobie z takich prostokątów całą planszę zauważysz ciekawą rzecz. Powstanie Ci pewnego rodzaju "macierz pseudo-3D"

Popatrz teraz jak wyglądają romby na siatce winksmiley.jpg

Pierwszy wzór: 1 prostokąt(2,3), sąsiedni prostokąt po prawej (wszystkie), 2 sąsiedni prostokąt po prawej (1,4)
Drugi wzór: 1 prostokąt(3,4), sąsiedni prostokąt po prawej (wszystkie), 2 sąsiedni prostokąt po prawej (1,2)
Trzeci wzór: 1 prostokąt(2,3), sąsiad po prawej(1,2), sąsiad poniżej(3,4), sąsiad po przekątnej w prawo i w dół(1,4)

Tylko zapisać planszę jako macierz takich prostokątów(trójkątów), a same romby jako złożone z nich winksmiley.jpg
marcinpruciak
Wszystko co pokazujecie jest ok, zakładając że nie ma dziur. A w moim przypadku mają takie być. I wtedy mi się wszystko rozjeżdża.
Każdy wiersz jest innej długości i romb 3 się nie chce spasować.
thek
A od kiedy mój czy hwao nie może mieć dziur? winksmiley.jpg Popatrz sobie na kolejny screen gdzie zaznaczyłem już romby!

romb 1 - żółty
romb 2 - pomarańcz
romb 3 - zieleń
Patrz jakie luki! Ja i hwao podaliśmy Ci tylko jak OPISAĆ przestrzeń na jakiej kładziesz romby. Nie daliśmy Ci przepisu jak ją zapełniać. To już jest Twoja działka smile.gif My daliśmy Ci tylko podwaliny pod to, co Ty masz zrobić. JAK to zrobisz to nie nasz problem. Możesz to zrobić nawet inaczej niż my. Z naszej strony dostałeś tylko pomysł jak się z problemem zapisu matematycznego planszy i rombów MOŻESZ rozprawić.
marcinpruciak
Masz rację. Miałem luki w przemyśleniach smile.gif;
Zrobiłem sposobem hwao i ma to sens.
Dzięki. Jak skończę to zamieszczę rozwiązanie do oceny.
thek
Zapisz więc sobie planszę matematycznie jak chcesz... Ja bym zrobił tak, że zamiast macierzy "pseudo-3D" zrobię sobie 2D, gdzie każdy "kafel" to będą 4 kolejne indeksy. Mogę sobie nawet zrobić "dziury", które oznaczę specjalnie. Chcesz nierówne? Proszę bardzo!
Pierwszy rząd ma 6 kafli, 2 rząd 5 kafli (brak ostatniego), a 3 rząd 2 kafle, przerwa na 1 i 3 kafle

WOW! Zmieściłem po 2 romby 1 i 3 oraz jedna 2 mimo dziur (oznaczonych szarym). Tak więc nie spełniłem warunku, że kafle są w całości ciągiem. Po prostu bez malowania uważasz, że się nie da, bo tego nie "widzisz". Ja tę planszę matematycznie w głowie jako macierz 2D widzę, w której puste pola są oznaczone jako 0, zajęte przez wzór 1,2,3 jako 1 (lub by było łatwiej z oznaczeniem 1,2,3 co odpowiadało by określonemu kolorowi), a dziury to 2 (lub 4 jeśli weźmiemy kolory), przy czym skrypt tych z 2 (lub 4) nie miałby prawa zmienić (nie da się przesunąć/załatać dziury) nawet na 0. Zwyczajnie popatrz na to inaczej.

Bym zapomniał. Pomysł hwao jest ok, ale z góry musisz założyć, czy trójkąt (0,0) jest do góry jednym czy dwoma rogami, bo to determinuje co możesz tam włożyć.

Jeśli do góry 1 rogiem to może być jak na rysunku, czy wejdzie tam romb 3([0,0],[1,0]) oraz 1([0,0],[0,1]) i to jest ból... bo romb 2 może wejść dopiero od klocka [0,1], czyli [0,0] leży niewykorzystany. Można to uznać za błąd skryptu.

Jeszcze gorzej gdy założysz, że [0,0] musi być skierowany 2 rogami do góry. Wtedy [0,0] może być startowym jedynie dla wzoru 2. Z tego klocka nie można ułożyć startu ani dla 1, ani dla 3. One tam po prostu nie pasują.

Właśnie dlatego podzieliłem plansze na kafle złożone z 4 trójkątów. W takim układzie zawsze zmarnują się na rogach maksymalnie 2 puste małe trójkąciki. Jest więc bardziej elastyczny. Ale jeśli przyjąć pewne założenia to zamieniłby się w układ dokładnie taki sam jaki proponuje hwao, ponieważ jego wersja jest szczególnym przypadkiem mojego smile.gif
marcinpruciak
Zrobiłem jednak sposobem theka. Wyszło coś takiego:
http://marcinpruciak.pl/romby2.php
Mam nadzieje że nie ma błędów. Jeszcze zostało pokolorować.
@thek: Masz jakiś pomysł jak wypisać gdzie są dziury?
thek
Dziury czy niezapełnione pola? Jeśli chcesz robić dziury od razu z góry to wprowadź dodatkowe oznaczenie, nie kolidujące z numeracją rombów, czyli przykładowo 4. A puste to po prostu te gdzie jest 0 smile.gif Po zakolorowaniu będziesz miał to wszystko bardzo ładnie widoczne. Jak widzę faktycznie algorytm nie polega na maksymalnym upychaniu, bo nieraz widziałem pola, gdzie można włożyć jeszcze jakiś z rombów smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.