Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> "Misiu musi przejść przez rzeczkę..." - Pomoc przy programie
Plasot
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 27.05.2015

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Plasot 19.05.2017, 07:26:02
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/smile.gif)

Problem dosc prosty a zabawy co nie miara (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #3





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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...
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Mam nadzieję, że nospor nie znajdzie dziury w całym
Nadzieja matka glupich (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #5





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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 (IMG:style_emoticons/default/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ść...
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tez mi wykazanie... skasowanie jednej linijki w gotowcu co podales (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #7





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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ć (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ale mozesz mi napisac co ty chcesz osiagnac? Bo teraz jak dla mnie kombinujesz jak kon pod gorke i ciagle nie wiem czemu (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #9





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Chciałbym wygenerować tabelkę ze znalezioną ścieżką, czyli zaznaczyć komórki tabeli.
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #11





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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.
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ale w ktorej petli while?
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #13





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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.
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




MI tam dziala. Jestes pewien ze NIC nie zmieniales? Przeciez ci tez dzialalo
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #15





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Już działa, literówka ;p
I nadal nie wiem, jak mam zaznaczyć komórki tabeli. Za krótki jestem...
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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... (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #17





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Rozwiazanie z rekurencja to jedno z mozliwych rozwiazan.

Rozwiazanie, ktore podal Kshyhoo jest lepsze od tego, ktore ja zaproponowalem na poczatku.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:55