Guest User

Untitled

a guest
May 26th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.87 KB | None | 0 0
  1. /*
  2. Piotr Madej 11K1
  3.  
  4. Legenda labiryntu:
  5. 0 - ściana
  6. 1 - ścieżka
  7. 2 - wejście
  8. 3 - wyjście
  9.  
  10. ---przykład---
  11.  
  12. 21113
  13. 01010
  14. 01111
  15.  
  16. Najkrótsze rozwiązanie
  17.  
  18. 2XXX3
  19. 01010
  20. 01111
  21. */
  22.  
  23.  
  24. #include "stdafx.h"
  25. #include "iostream"
  26. #include "fstream"
  27. #include "string"
  28. #include "windows.h"
  29.  
  30. using namespace std;
  31.  
  32. //zdeklarowanie funkcji menu
  33. void menu(int** labirynt, int x, int y, int max);
  34.  
  35. //zdeklarowanie funkcji animacja
  36. void animacja(int** labirynt, int x, int y, int max);
  37.  
  38. void main() {
  39. int x, y=0, z, g, buff, **labirynt, **wyjscia, xp=0,yp=0, elementy=0, element2=0, element3=0, err=0, xw, yw, krok, xb, yb, max;
  40. char *buff2;
  41. string nazwa_pliku;
  42. ifstream plik;
  43.  
  44. // petla nieskonczona dopóki nie wczyta sie pliku
  45. do{
  46. // plik musi znajdowac sie we folderze razem z program, prosze nie zapomniec o rozszerzeniu
  47. cout << "podaj nazwe pliku w ktorym znajduje sie labirynt: ";
  48. cin >> nazwa_pliku;
  49. plik.open(nazwa_pliku);
  50. }while(!plik.is_open());
  51.  
  52. // sprawdzanie dlugosc pliku
  53. plik.seekg(0, ios::end);
  54. buff = plik.tellg();
  55. plik.seekg(0, ios::beg);
  56.  
  57. // tworzenie dynamicznej tablicy na zawartosc pliku
  58. buff2 = new char[buff];
  59.  
  60. // zapisanie danych z pliku do tablicy pomocniczej
  61. plik.read(buff2,buff);
  62. buff2[buff] = 0;
  63.  
  64. // zamykanie pliku
  65. plik.close();
  66.  
  67. // sprawdzanie liczby kolumn i wierszy labiryntu
  68. for(z=0; z<buff; z++)
  69. {
  70. // kolumn
  71. if(((buff2[z] == '\r') | (buff2[z] == '\n')) & (y == 0))
  72. {
  73. y = z;
  74. }
  75.  
  76. // wierszy
  77. if(buff2[z] == '3')
  78. {
  79. element3++;
  80. elementy++;
  81. }
  82.  
  83. if(buff2[z] == '2')
  84. {
  85. element2++;
  86. elementy++;
  87. }
  88.  
  89. if((buff2[z] == '1') | (buff2[z] == '0'))
  90. {
  91. elementy++;
  92. }
  93. }
  94.  
  95. if(elementy % y == 0)
  96. {
  97. x = elementy/y;
  98.  
  99. // deklaruje glowna tablice dynamiczna do przechowywania labiryntu
  100. labirynt = new int*[x];
  101. for(z = 0; z < x; z++)
  102. {
  103. labirynt[z] = new int[y];
  104. }
  105.  
  106. // wprowadzenie danych do głównej talbicy i walidacja
  107. for(z=0; z<buff; z++)
  108. {
  109. if(buff2[z] == '1' || buff2[z] == '0' || buff2[z] == '2' || buff2[z] == '3')
  110. {
  111. if(xp == x)
  112. {
  113. cout << "koniec";
  114. break;
  115. }
  116.  
  117. labirynt[xp][yp] = buff2[z] - '0';
  118. yp++;
  119.  
  120. if(yp == y)
  121. {
  122. xp++;
  123. yp=0;
  124. }
  125. }
  126. }
  127.  
  128. // walidacja. jedno wejscie i wyjscia polozone w granicy labiryntu
  129. for(xp=0; xp < x; xp++)
  130. {
  131. for(yp=0; yp < y; yp++)
  132. {
  133. if(labirynt[xp][yp] == 2)
  134. {
  135. if(!((xp == 0) | (yp == 0) | (xp == (x - 1)) | (yp == (y - 1))))
  136. {
  137. cout << "err. wejscie nie znajduje sie w granicy labiryntu\n";
  138. err = 1;
  139. }
  140. }
  141.  
  142. if(labirynt[xp][yp] == 3)
  143. {
  144. if(!((xp == 0) | (yp == 0) | (xp == (x - 1)) | (yp == (y - 1))))
  145. {
  146. cout << "err. wyjscie nie znajduje sie w granicy labiryntu\n";
  147. err = 1;
  148. }
  149. }
  150. }
  151. }
  152.  
  153. if((element2 != 1) | (element3 < 1))
  154. {
  155. cout << "err. za malo/duzo wejsc/wyjsc z labiryntu\n";
  156. err = 1;
  157. }
  158.  
  159. } else
  160. {
  161. cout << "err. niepoprawna struktura labiryntu\n";
  162. cout << "debug. " << y << "\n" << buff << "\n";
  163. err = 1;
  164. }
  165.  
  166. if(err != 1)
  167. {
  168. cout << "\nwczytano nastepujacy labirynt\n\n";
  169.  
  170. for(xp=0; xp < x; xp++)
  171. {
  172. for(yp=0; yp < y; yp++)
  173. {
  174. cout << labirynt[xp][yp];
  175. }
  176. cout << "\n";
  177. }
  178.  
  179. //tworze liste wyjsc
  180. wyjscia = new int*[x];
  181. for(z = 0; z < element3; z++)
  182. {
  183. wyjscia[z] = new int[2];
  184. }
  185.  
  186. // przerabiam labirynt pod swój algorytm: wyjście=1
  187. z=0;
  188. for(xp=0; xp < x; xp++)
  189. {
  190. for(yp=0; yp < y; yp++)
  191. {
  192. if(labirynt[xp][yp] == 3)
  193. {
  194. labirynt[xp][yp] = 1;
  195. wyjscia[z][0] = xp;
  196. wyjscia[z][1] = yp;
  197. z++;
  198. }
  199. }
  200. }
  201.  
  202. // algorytm wykonujący kolejno kroki w każdą możliwą stronę zaczynając od wejścia do labiryntu
  203. krok=1;
  204. do{
  205. g=0;
  206. do{
  207. z=0;
  208. for(xp=0; xp < x; xp++)
  209. {
  210. for(yp=0; yp < y; yp++)
  211. {
  212. if(labirynt[xp][yp] > krok)
  213. {
  214. // wykonujemy krok w góre
  215. if(xp > 0)
  216. {
  217. if(labirynt[xp - 1][yp] == 1)
  218. {
  219. labirynt[xp - 1][yp] = labirynt[xp][yp] + 1;
  220. z++;
  221. g++;
  222. }
  223. }
  224.  
  225. // wykonujemy krok w lewo
  226. if(yp > 0)
  227. {
  228. if(labirynt[xp][yp - 1] == 1)
  229. {
  230. labirynt[xp][yp - 1] = labirynt[xp][yp] + 1;
  231. z++;
  232. g++;
  233. }
  234. }
  235.  
  236. // wykonujemy krok w prawo
  237. if(yp < (y - 1))
  238. {
  239. if(labirynt[xp][yp + 1] == 1)
  240. {
  241. labirynt[xp][yp + 1] = labirynt[xp][yp] + 1;
  242. z++;
  243. g++;
  244. }
  245. }
  246.  
  247. // wykonujemy krok w dół
  248. if(xp < (x - 1))
  249. {
  250. if(labirynt[xp + 1][yp] == 1)
  251. {
  252. labirynt[xp + 1][yp] = labirynt[xp][yp] + 1;
  253. z++;
  254. g++;
  255. }
  256. }
  257. }
  258. }
  259. }
  260. }while(z!=0);
  261. krok++;
  262. }while(g!=0);
  263.  
  264. buff=labirynt[wyjscia[0][0]][wyjscia[0][1]];
  265. xw = wyjscia[0][0];
  266. yw = wyjscia[0][1];
  267.  
  268. for(xp=0; xp < element3; xp++)
  269. {
  270. if((labirynt[wyjscia[xp][0]][wyjscia[xp][1]] < buff) & (labirynt[wyjscia[xp][0]][wyjscia[xp][1]] != 1))
  271. {
  272. buff=labirynt[wyjscia[xp][0]][wyjscia[xp][1]];
  273. xw = wyjscia[xp][0];
  274. yw = wyjscia[xp][1];
  275. }
  276. }
  277.  
  278. // wyświetlenie rozwiązania
  279. if(labirynt[xw][yw] != 1)
  280. {
  281. max = labirynt[xw][yw] - 2;
  282. cout << "\nliczba krokow potrzebna do przejscia labiryntu wynosi " << max << "\n\n";
  283.  
  284. xb = xw;
  285. yb = yw;
  286.  
  287. do{
  288. buff = labirynt[xb][yb];
  289. labirynt[xb][yb] = -labirynt[xb][yb];
  290.  
  291. for(xp=0; xp < x; xp++)
  292. {
  293. for(yp=0; yp < y; yp++)
  294. {
  295. if(labirynt[xp][yp] > buff)
  296. {
  297. labirynt[xp][yp] = -1;
  298. }
  299. }
  300. }
  301.  
  302.  
  303. if(xb < (x - 1))
  304. {
  305. if(labirynt[xb + 1][yb] == buff - 1)
  306. {
  307. xb = xb + 1;
  308. yb = yb;
  309. }
  310. }
  311.  
  312. if(yb < (y - 1))
  313. {
  314. if(labirynt[xb][yb + 1] == buff - 1)
  315. {
  316. xb = xb;
  317. yb = yb + 1;
  318. }
  319. }
  320.  
  321. if(yb > 0)
  322. {
  323. if(labirynt[xb][yb - 1] == buff - 1)
  324. {
  325. xb = xb;
  326. yb = yb - 1;
  327. }
  328. }
  329.  
  330. if(xb > 0)
  331. {
  332. if(labirynt[xb - 1][yb] == buff - 1)
  333. {
  334. xb = xb - 1;
  335. yb = yb;
  336. }
  337. }
  338.  
  339. }while(labirynt[xb][yb] != 2);
  340.  
  341. // bug przy labiryntach gdzie kroków jest jeden lub dwa
  342. for(xp=0; xp < x; xp++)
  343. {
  344. for(yp=0; yp < y; yp++)
  345. {
  346. if(labirynt[xp][yp] == 3)
  347. {
  348. labirynt[xp][yp] = -1;
  349. }
  350. }
  351. }
  352.  
  353. labirynt[xw][yw] = 3;
  354.  
  355. for(xp=0; xp < x; xp++)
  356. {
  357. for(yp=0; yp < y; yp++)
  358. {
  359. if(labirynt[xp][yp] == -1)
  360. {
  361. cout << char(248);
  362. } else
  363. {
  364. if(labirynt[xp][yp] < -1)
  365. {
  366. cout << char(254);
  367. } else
  368. {
  369. if(labirynt[xp][yp] == 0)
  370. {
  371. cout << char(178);
  372. } else
  373. {
  374. cout << labirynt[xp][yp];
  375. }
  376. }
  377. }
  378. }
  379. cout << "\n";
  380. }
  381.  
  382. // przechodzimy do menu
  383. menu(labirynt, x, y, max);
  384.  
  385. } else
  386. {
  387. cout << "\nbrak rozwiazan labiryntu\n";
  388. }
  389. } else
  390. {
  391. cout << "prosze poprawic plik z labiryntem i uruchomic program ponownie\n";
  392. }
  393.  
  394. system("pause");
  395. }
  396.  
  397. // opisanie funkcji menu
  398. void menu(int** labirynt, int x, int y, int max) {
  399. int xp, yp, menu, koniec=0;
  400. string nazwa_pliku;
  401. ofstream zapisz;
  402.  
  403. // menu z wyborem
  404. do{
  405. cout << "\nMenu. Co chcesz robic?\n";
  406. cout << "1) Zapisz rozwiazanie labiryntu do pliku\n";
  407. cout << "2) Wykonaj animacje przechodzenia labiryntu!\n";
  408. cout << "3) Zamknij program\n";
  409. cout << "Wybieram: ";
  410. cin >> menu;
  411. switch(menu)
  412. {
  413. case 1:
  414. do{
  415. cout << "podaj nazwe pliku w ktorym mam zapisac rozwiazanie labiryntu: ";
  416. cin >> nazwa_pliku;
  417. zapisz.open(nazwa_pliku);
  418. }while(!zapisz.is_open());
  419.  
  420. // tutaj użylem strumieni do zapisywania plikow, nie boje sie o
  421. for(xp=0; xp < x; xp++)
  422. {
  423. for(yp=0; yp < y; yp++)
  424. {
  425. if(labirynt[xp][yp] == -1)
  426. {
  427. zapisz << "1";
  428. } else
  429. {
  430. if(labirynt[xp][yp] < -1)
  431. {
  432. zapisz << "#";
  433. } else
  434. {
  435. zapisz << labirynt[xp][yp];
  436. }
  437. }
  438. }
  439. zapisz << "\n";
  440. }
  441. zapisz.close();
  442. cout << "Zapisano rozwiazanie do pliku\n";
  443. break;
  444. case 2:
  445. animacja(labirynt, x, y, max);
  446. break;
  447. case 3:
  448. koniec = 1;
  449. // nie wiem czemu nie można użyć 'break 2;' aby wyjść też z pętli do-while()?
  450. break;
  451. }
  452.  
  453. if(koniec == 1)
  454. {
  455. break;
  456. }
  457. }while(1);
  458. }
  459.  
  460. // opisanie funkcji animacji
  461. void animacja(int** labirynt, int x, int y, int max) {
  462. int xp, yp, start, **tabanimacja;
  463. start = 4;
  464. max = max + 3;
  465. system("cls");
  466.  
  467. tabanimacja = new int*[x];
  468. for(int z = 0; z < x; z++)
  469. {
  470. tabanimacja[z] = new int[y];
  471. }
  472.  
  473. for(xp=0; xp < x; xp++)
  474. {
  475. for(yp=0; yp < y; yp++)
  476. {
  477. tabanimacja[xp][yp] = labirynt[xp][yp];
  478. }
  479. }
  480.  
  481. for(xp=0; xp < x; xp++)
  482. {
  483. for(yp=0; yp < y; yp++)
  484. {
  485. if(tabanimacja[xp][yp] == -1)
  486. {
  487. tabanimacja[xp][yp] = 1;
  488. }
  489.  
  490. if(tabanimacja[xp][yp] < 0)
  491. {
  492. tabanimacja[xp][yp] = tabanimacja[xp][yp] - 1;
  493. }
  494.  
  495. if(tabanimacja[xp][yp] < 0)
  496. {
  497. tabanimacja[xp][yp] = -tabanimacja[xp][yp];
  498. }
  499. }
  500. }
  501. do{
  502. for(xp=0; xp < x; xp++)
  503. {
  504. for(yp=0; yp < y; yp++)
  505. {
  506. if(tabanimacja[xp][yp] > start)
  507. {
  508. cout << char(248);
  509. } else
  510. {
  511. if((tabanimacja[xp][yp] == start) | (tabanimacja[xp][yp] > 3))
  512. {
  513. cout << char(254);
  514. } else
  515. {
  516. if(tabanimacja[xp][yp] == 0)
  517. {
  518. cout << char(178);
  519. }
  520.  
  521. if(tabanimacja[xp][yp] == 1)
  522. {
  523. cout << char(248);
  524. }
  525.  
  526. if((tabanimacja[xp][yp] == 2) | (tabanimacja[xp][yp] == 3))
  527. {
  528. cout << tabanimacja[xp][yp];
  529. }
  530. }
  531. }
  532. }
  533. cout << "\n";
  534. }
  535.  
  536. // bug przy jednym kroku
  537. if(max == start)
  538. {
  539. break;
  540. }
  541.  
  542. start++;
  543. Sleep(1000);
  544. if(max != start)
  545. system("cls");
  546. }while((max != start));
  547. }
Add Comment
Please, Sign In to add comment