Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> "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
 
Start new topic
Odpowiedzi (1 - 17)
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 smile.gif

Problem dosc prosty a zabawy co nie miara smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 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 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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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ć 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 smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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... tongue.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 04:45