Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "Misiu musi przejść przez rzeczkę..." - Pomoc przy programie
Forum PHP.pl > Forum > PHP
Plasot
Witam. Mój nauczyciel dał mi do wykonania program, który sprawi czy misiek dojdzie od startu do mety poruszając się wyłącznie po parzystych polach(bez cofania). Pola stworzyłem jako tablicę dwuwymiarową. W tej chwili program wygląda tak:
  1. <body>
  2. <?php
  3. $dane[0][0] = rand(1, 4);
  4. $dane[0][1] = rand(1, 4);
  5. $dane[0][2] = rand(1, 4);
  6. $dane[0][3] = rand(1, 4);
  7.  
  8. $dane[1][0] = rand(1, 4);
  9. $dane[1][1] = rand(1, 4);
  10. $dane[1][2] = rand(1, 4);
  11. $dane[1][3] = rand(1, 4);
  12.  
  13. $dane[2][0] = rand(1, 4);
  14. $dane[2][1] = rand(1, 4);
  15. $dane[2][2] = rand(1, 4);
  16. $dane[2][3] = rand(1, 4);
  17.  
  18. $dane[3][0] = rand(1, 4);
  19. $dane[3][1] = rand(1, 4);
  20. $dane[3][2] = rand(1, 4);
  21. $dane[3][3] = rand(1, 4);
  22. ?>
  23. Czy miś dojdzie do miodu, jeżeli będzie sie poruszał po samych przystych polach?
  24. <table>
  25. <tr>
  26. <td>-------</td><td>-------</td><td>Start</td><td>-------</td>
  27. </tr>
  28. <tr>
  29. <td><?php echo $dane[0][0]; ?></td> <td><?php echo $dane[0][1]; ?></td> <td><?php echo $dane[0][2]; ?></td> <td><?php echo $dane[0][3]; ?></td>
  30. </tr>
  31. <tr>
  32. <td><?php echo $dane[1][0]; ?></td> <td><?php echo $dane[1][1]; ?></td> <td><?php echo $dane[1][2]; ?></td> <td><?php echo $dane[1][3]; ?></td>
  33. </tr>
  34. <tr>
  35. <td><?php echo $dane[2][0]; ?></td> <td><?php echo $dane[2][1]; ?></td> <td><?php echo $dane[2][2]; ?></td> <td><?php echo $dane[2][3]; ?></td>
  36. </tr>
  37. <tr>
  38. <td><?php echo $dane[3][0]; ?></td> <td><?php echo $dane[3][1]; ?></td> <td><?php echo $dane[3][2]; ?></td> <td><?php echo $dane[3][3]; ?></td>
  39. </tr>
  40. <tr>
  41. <td>-------</td><td>Start</td><td>-------</td><td>-------</td>
  42. </tr>
  43. </table>
  44. <br>
  45. <body>


Będę wdzięczny za pomoc w wykonaniu programu.
Pozdrawiam.
nospor
To co tutaj masz to problem skoczka szachowego, ino ze w prostrzej wersji. Poszukaj na necie, pelno tego.

W wielkim skrocie:
musisz stworzyc funkcje rekurencyjna
startujesz z pola. Idziesz w prawo jesli mozesz. Znowu odpalasz w funkcje z nowa pozycja, znowy idziesz w prawo jesli mozesz itd...Gdy nie mozesz isc w prawo, idziesz prosto. Gdy nie mozesz isc prosto idziesz w lewo. Gdy nie mozesz nigdzie isc, konczysz przebieg aktualnej funkcji i samo sie wraca do poprzedniego stanu - ladna rekurencja smile.gif

Problem dosc prosty a zabawy co nie miara smile.gif
Kshyhoo
Mam nadzieję, że nospor nie znajdzie dziury w całym ;p
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4.  
  5. <p>Czy miś dojdzie do miodu, jeżeli będzie sie poruszał po samych parzystych polach?</p><br />
  6.  
  7. <?php
  8. $dane[0][0] = rand(1, 4);
  9. $dane[0][1] = rand(1, 4);
  10. $dane[0][2] = rand(1, 4);
  11. $dane[0][3] = rand(1, 4);
  12.  
  13. $dane[1][0] = rand(1, 4);
  14. $dane[1][1] = rand(1, 4);
  15. $dane[1][2] = rand(1, 4);
  16. $dane[1][3] = rand(1, 4);
  17.  
  18. $dane[2][0] = rand(1, 4);
  19. $dane[2][1] = rand(1, 4);
  20. $dane[2][2] = rand(1, 4);
  21. $dane[2][3] = rand(1, 4);
  22.  
  23. $dane[3][0] = rand(1, 4);
  24. $dane[3][1] = rand(1, 4);
  25. $dane[3][2] = rand(1, 4);
  26. $dane[3][3] = rand(1, 4);
  27.  
  28. ?>
  29.  
  30. <table border="1" cellpadding="0" cellspacing="0">
  31. <tr>
  32. <td>-----</td>
  33. <td>-----</td>
  34. <td>Start</td>
  35. <td>-----</td>
  36. </tr>
  37. <tr>
  38. <td><?php echo $dane[0][0]; ?></td>
  39. <td><?php echo $dane[0][1]; ?></td>
  40. <td><?php echo $dane[0][2]; ?></td>
  41. <td><?php echo $dane[0][3]; ?></td>
  42. </tr>
  43. <tr>
  44. <td><?php echo $dane[1][0]; ?></td>
  45. <td><?php echo $dane[1][1]; ?></td>
  46. <td><?php echo $dane[1][2]; ?></td>
  47. <td><?php echo $dane[1][3]; ?></td>
  48. </tr>
  49. <tr>
  50. <td><?php echo $dane[2][0]; ?></td>
  51. <td><?php echo $dane[2][1]; ?></td>
  52. <td><?php echo $dane[2][2]; ?></td>
  53. <td><?php echo $dane[2][3]; ?></td>
  54. </tr>
  55. <tr>
  56. <td><?php echo $dane[3][0]; ?></td>
  57. <td><?php echo $dane[3][1]; ?></td>
  58. <td><?php echo $dane[3][2]; ?></td>
  59. <td><?php echo $dane[3][3]; ?></td>
  60. </tr>
  61. <tr>
  62. <td>-----</td>
  63. <td>Meta</td>
  64. <td>-----</td>
  65. <td>-----</td>
  66. </tr>
  67. </table>
  68.  
  69. <?php
  70.  
  71. echo '<br />';
  72. echo "przed zmianą: <br />";
  73. //echo "<pre>";
  74. print_r($dane);
  75. //echo "</pre>";
  76. echo '<br /><br />';
  77.  
  78. // zmiana liczb parzystych na kropki a nieparzystych na gwiazdki
  79. array_walk_recursive($dane, function(&$value) {
  80. $value = ($value %2 == 0) ? '.' : '*';
  81. });
  82.  
  83. ?>
  84.  
  85. <table border="1" cellpadding="0" cellspacing="0">
  86. <tr>
  87. <td>-----</td>
  88. <td>-----</td>
  89. <td>Start</td>
  90. <td>-----</td>
  91. </tr>
  92. <tr>
  93. <td><?php echo $dane[0][0]; ?></td>
  94. <td><?php echo $dane[0][1]; ?></td>
  95. <td><?php echo $dane[0][2]; ?></td>
  96. <td><?php echo $dane[0][3]; ?></td>
  97. </tr>
  98. <tr>
  99. <td><?php echo $dane[1][0]; ?></td>
  100. <td><?php echo $dane[1][1]; ?></td>
  101. <td><?php echo $dane[1][2]; ?></td>
  102. <td><?php echo $dane[1][3]; ?></td>
  103. </tr>
  104. <tr>
  105. <td><?php echo $dane[2][0]; ?></td>
  106. <td><?php echo $dane[2][1]; ?></td>
  107. <td><?php echo $dane[2][2]; ?></td>
  108. <td><?php echo $dane[2][3]; ?></td>
  109. </tr>
  110. <tr>
  111. <td><?php echo $dane[3][0]; ?></td>
  112. <td><?php echo $dane[3][1]; ?></td>
  113. <td><?php echo $dane[3][2]; ?></td>
  114. <td><?php echo $dane[3][3]; ?></td>
  115. </tr>
  116. <tr>
  117. <td>-----</td>
  118. <td>Meta</td>
  119. <td>-----</td>
  120. <td>-----</td>
  121. </tr>
  122. </table>
  123.  
  124. <?php
  125.  
  126. echo '<br />';
  127. echo "Po zmianie: <br />";
  128. //echo "<pre>";
  129. print_r($dane);
  130. //echo "</pre>";
  131. echo '<br />';
  132.  
  133.  
  134. // start i meta
  135. $wynik = trasa($dane, array(0, 2), array(3, 1));
  136.  
  137. if (count($wynik) == 0)
  138. echo "<p>Brak trasy</p>";
  139. if (count($wynik) == 1)
  140. echo "<p>Nie nastąpiło przemieszczenie</p>";
  141. if (count($wynik) > 1) {
  142. echo "<p>Jest trasa przejścia, jej współrzędne: </p>";
  143. foreach($wynik as $punkt)
  144. echo "($punkt[0], $punkt[1]) ";
  145. }
  146.  
  147. function trasa($dane, $start, $stop) {
  148. // nie można wykonać obliczeń, gdy punkty startowy i końcowy są zajęte
  149. if ($dane[$stop[1]][$stop[0]] <> '.' or $dane[$start[1]][$start[0]] <> '.') return;
  150.  
  151. $licznik = 1; // licznik określa kolejne odległości od końca
  152. $dane[$stop[1]][$stop[0]] = $licznik;
  153. $punkty[] = $stop;
  154. while(count($punkty) > 0) {
  155. $licznik++;
  156. foreach($punkty as $p) {
  157. $x = $p[0];
  158. $y = $p[1];
  159. if ($x == $start[0] and $y == $start[1]) {
  160. $jest = true;
  161. unset($n);
  162. break;
  163. }
  164. if ($dane[$y][$x - 1] == '.') { $dane[$y][$x - 1] = $licznik; $n[] = array($x - 1, $y); }
  165. if ($dane[$y][$x + 1] == '.') { $dane[$y][$x + 1] = $licznik; $n[] = array($x + 1, $y); }
  166. if ($dane[$y + 1][$x] == '.') { $dane[$y + 1][$x] = $licznik; $n[] = array($x, $y + 1); }
  167. if ($dane[$y - 1][$x] == '.') { $dane[$y - 1][$x] = $licznik; $n[] = array($x, $y - 1); }
  168. }
  169. $punkty = $n;
  170. unset($n);
  171. }
  172.  
  173. // jeżeli nie udało się od końca dotrzeć do początku, nie ma przejścia
  174. if (!$jest)
  175. return;
  176.  
  177. while($dane[$start[1]][$start[0]] > 1) {
  178. $x = $start[0];
  179. $y = $start[1];
  180. if ($dane[$y][$x - 1] > 0 and $dane[$y][$x - 1]<$dane[$y][$x]) $start = array($x - 1, $y);
  181. if ($dane[$y][$x + 1] > 0 and $dane[$y][$x + 1]<$dane[$y][$x]) $start = array($x + 1, $y);
  182. if ($dane[$y + 1][$x] > 0 and $dane[$y + 1][$x]<$dane[$y][$x]) $start = array($x, $y + 1);
  183. if ($dane[$y - 1][$x] > 0 and $dane[$y - 1][$x]<$dane[$y][$x]) $start = array($x, $y - 1);
  184. $wynik[] = array($x,$y);
  185. }
  186. $wynik[] = array($stop[0], $stop[1]);
  187.  
  188. return $wynik;
  189. }
  190.  
  191. ?>
  192.  
  193. </body>
  194. </html>

Kod sprawdza wszystkie cztery kierunki, ale można zakomentować ruch wstecz. Tablica o tak małych wymiarach jest nieco uciążliwa, drogę znajduje raz na kilkanaście razy...
nospor
Cytat
Mam nadzieję, że nospor nie znajdzie dziury w całym
Nadzieja matka glupich tongue.gif
Ale ze juz piatek wieczor to przemilcze.

Swoja droga zawsze prace domowe zamykasz a tu nie dosc ze nie zamknales to dales pelnego gotowca tongue.gif
Kshyhoo
No właśnie, że nie gotowca, bo jego założenia były inne, więc będzie się musiał wykazać...
To pisz, co można by polepszyć, bom ciekaw wink.gif
Fajnie byłoby wygenerować tabelkę ze znalezioną drogą. Pewnie trzeba by wyszukać w tablicy $dane wartości z tablicy $wynik i porownać. Masz na to jakiś pomysł, bo nie mogę na to wpaść...
nospor
Tez mi wykazanie... skasowanie jednej linijki w gotowcu co podales tongue.gif

Z pisania nie ma co duzo pisac...
Ot zamiast
return;

powinno byc
return null;
albo
return [];
Pozniej nie count == 0 a poptostu empty
Zas kolejne IF powinny miec else w sobie

Cytat
Pewnie trzeba by wyszukać w tablicy $dane wartości z tablicy $wynik i porownać.

Nie bardzo rozumiem... A po co? Przeciez w $wynik masz wspolrzedne sciezki, co tam chcesz porownywac? No chyba ze przy wyswietlaniu planszy?
Kshyhoo
No właśnie, mam tablicę złożoną ze współrzędnymi ścieżki i nie bardzo wiem, jak to wyświetlić.

Mógłbym tak:
  1. for ($i=0; $i<=count($dane);$i++) {
  2. for($j=0;$j<=count($dane);$j++) {
  3. if($dane[$i][$j] == $wynik[$i][$j]) {
  4. $tab3[$i][0] = $dane[$i][0];
  5. $tab3[$i][1] = $dane[$i][1];
  6. $tab3[$i][2] = $dane[$i][2];
  7. $tab3[$i][3] = $dane[$i][3];
  8. }
  9. }
  10. }

Ale nieoptymalne do granic możliwości.

O, znalazłem array_intersect, czas pokombinować wink.gif
nospor
Ale mozesz mi napisac co ty chcesz osiagnac? Bo teraz jak dla mnie kombinujesz jak kon pod gorke i ciagle nie wiem czemu smile.gif
Kshyhoo
Chciałbym wygenerować tabelkę ze znalezioną ścieżką, czyli zaznaczyć komórki tabeli.
nospor
No i dobrze. To czemu tego nie robisz przy generowaniu tej tabelki tylko gdzies na boku i totalnie jakos dziwnie?
Dodatkowo tabela $wynik powinna miec index "$x,$y" - wowczas od razu bedziesz wiedzial czy dla wspolrzednych x i y jest sciezka czy nie i po sprawie.
Kshyhoo
Nie wiedzieć czemu, nic nie kombinując mam tak:
Cytat
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in C:\AppServ\www\__test\mis.php on line 182

czyli gdzieś w pętli while.
nospor
Ale w ktorej petli while?
Kshyhoo
W drugiej.

  1. while($dane[$start[1]][$start[0]] > 1) {
  2. $x = $start[0];
  3. $y = $start[1];
  4. if ($dane[$y][$x - 1] > 0 and $dane[$y][$x - 1]<$dane[$y][$x]) $start = array($x - 1, $y);
  5. if ($dane[$y][$x + 1] > 0 and $dane[$y][$x + 1]<$dane[$y][$x]) $start = array($x + 1, $y);
  6. if ($dane[$y + 1][$x] > 0 and $dane[$y + 1][$x]<$dane[$y][$x]) $start = array($x, $y + 1);
  7. if ($dane[$y - 1][$x] > 0 and $dane[$y - 1][$x]<$dane[$y][$x]) $start = array($x, $y - 1);
  8. $wynik[] = array($x,$y);
  9. }
  10. $wynik[] = array($stop[0], $stop[1]);
  11.  
  12. return $wynik;



369856 bez tablicy $dane.
nospor
MI tam dziala. Jestes pewien ze NIC nie zmieniales? Przeciez ci tez dzialalo
Kshyhoo
Już działa, literówka ;p
I nadal nie wiem, jak mam zaznaczyć komórki tabeli. Za krótki jestem...
nospor
Cytat
Nie wiedzieć czemu, nic nie kombinując mam tak:

Cytat
Już działa, literówka ;p

Moglbys sie kiedys nauczyc rozrozniac nic nie kombuje od cos jednak kombinuje... tongue.gif
Kshyhoo
smile.gif
nospor
Rozwiazanie z rekurencja to jedno z mozliwych rozwiazan.

Rozwiazanie, ktore podal Kshyhoo jest lepsze od tego, ktore ja zaproponowalem na poczatku.
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.