Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.40 KB | None | 0 0
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. Classes, crt, graph
  10. { you can add units after this };
  11. type pole=array[1..8,1..8]of integer;
  12. sur=record
  13. m,n:integer;
  14. end;
  15.  
  16. bunka=record
  17. parent:sur;
  18.  
  19. bolSom,cesta,prekazka:boolean;
  20. end;
  21. var x,m,n:array[1..8]of integer;
  22. a:array[1..8]of boolean;
  23. b:array[2..16]of boolean;
  24. c:array[-7..7]of boolean;
  25. q,q2,striedanie,najdene:boolean;
  26. i,j,velkost,vyska,sirka,prekazky,index,kon,max:integer;
  27. z,q3,q4:char;
  28. h:array[1..8,1..8]of integer;
  29. bludisko:array[1..82,1..82]of bunka;
  30. //bolSom:array[1..82,1..82]of boolean;
  31. bunky:array[1..6400]of sur;
  32. gm,gd:smallint;
  33. zaciatok,ciel:sur;
  34. procedure skus(i:integer);
  35. var j:integer;
  36. begin
  37. j:=0;
  38. repeat
  39. j:=j+1;
  40. if a[j] and b[i+j] and c[i-j] then
  41. begin
  42. x[i]:=j;
  43. a[j]:=false;
  44. b[i+j]:=false;
  45. c[i-j]:=false;
  46. if i<velkost then begin
  47. skus(i+1);
  48. if q=false then
  49. begin
  50. a[j]:=true;
  51. b[i+j]:=true;
  52. c[i-j]:=true;
  53. end;
  54. end
  55. else q:=true;
  56. end;
  57. until (j=velkost) or q;
  58. end;
  59. procedure generujBludisko(pocet:integer);
  60. var i,j,r1,r2:integer;
  61. begin
  62. //for i:=2 to vyska-1 do
  63. //for j:=2 to sirka-1 do
  64. //bludisko[i,j].:=' ';
  65. for i:=1 to vyska do
  66. for j:=1 to sirka do
  67. bludisko[i,j].prekazka:=false;
  68. for i:=1 to vyska do
  69. for j:=1 to sirka do
  70. bludisko[i,j].bolSom:=false;
  71. for i:=1 to vyska do
  72. for j:=1 to sirka do
  73. bludisko[i,j].cesta:=false;
  74. if q3='y' then
  75. begin
  76. for i:=1 to pocet do
  77. begin
  78. repeat
  79. r1:=random(vyska)+1;
  80. r2:=random(sirka)+1;
  81. until (bludisko[r1,r2].prekazka=false)
  82. and
  83. (((r1<>zaciatok.m) or (r2<>zaciatok.n))
  84. and
  85. ((r1<>zaciatok.m+1) or (r2<>zaciatok.n+1))
  86. and
  87. ((r1<>zaciatok.m+1) or (r2<>zaciatok.n))
  88. and
  89. ((r1<>zaciatok.m+1) or (r2<>zaciatok.n-1))
  90. and
  91. ((r1<>zaciatok.m) or (r2<>zaciatok.n-1))
  92. and
  93. ((r1<>zaciatok.m-1) or (r2<>zaciatok.n-1))
  94. and
  95. ((r1<>zaciatok.m-1) or (r2<>zaciatok.n))
  96. and
  97. ((r1<>zaciatok.m-1) or (r2<>zaciatok.n+1))
  98. and
  99. ((r1<>zaciatok.m) or (r2<>zaciatok.n+1))
  100. and
  101. (((r1<>ciel.m) or (r2<>ciel.n))
  102. and
  103. ((r1<>ciel.m+1) or (r2<>ciel.n+1))
  104. and
  105. ((r1<>ciel.m+1) or (r2<>ciel.n))
  106. and
  107. ((r1<>ciel.m+1) or (r2<>ciel.n-1))
  108. and
  109. ((r1<>ciel.m) or (r2<>ciel.n-1))
  110. and
  111. ((r1<>ciel.m-1) or (r2<>ciel.n-1))
  112. and
  113. ((r1<>ciel.m-1) or (r2<>ciel.n))
  114. and
  115. ((r1<>ciel.m-1) or (r2<>ciel.n+1))
  116. and
  117. ((r1<>ciel.m) or (r2<>ciel.n+1))));
  118. bludisko[r1,r2].prekazka:=true;
  119. end;
  120. end
  121. else
  122. begin
  123. for i:=1 to pocet do
  124. begin
  125. repeat
  126. r1:=random(vyska)+1;
  127. r2:=random(sirka)+1;
  128. until (bludisko[r1,r2].prekazka=false) and (((r1<>1) or (r2<>2)) and ((r1<>2) or (r2<>1)) and ((r1<>2) or (r2<>2)) and ((r1<>1) or (r2<>1)) and ((r1<>vyska-1) or (r2<>sirka-1)) and ((r1<>vyska) or (r2<>sirka-1)) and ((r1<>vyska-1) or (r2<>sirka)) and ((r1<>vyska) or (r2<>sirka)));
  129. bludisko[r1,r2].prekazka:=true;
  130. end;
  131. end;
  132. end;
  133. procedure vypisBludiska();
  134. var i,j:integer;
  135. begin
  136. for i:=1 to vyska do
  137. begin
  138. for j:=1 to sirka do
  139. begin
  140. if (i=zaciatok.m) and (j=zaciatok.n) then write('Z ')
  141. else if (i=ciel.m) and (j=ciel.n) then write('C ')
  142. else if bludisko[i,j].cesta=true then write('= ')
  143. else if bludisko[i,j].bolSom=true then write('O ')
  144. else if bludisko[i,j].prekazka=true then write('# ')
  145. else write('- ');
  146. end;
  147. writeln;
  148. end;
  149. end;
  150. procedure vypisBludiskaGraphom();
  151. var i,j:integer;
  152. begin
  153. if sirka<vyska then max:=GetMaxY div vyska
  154. else max:=GetMaxX div sirka;
  155. for i:=1 to vyska do
  156. for j:=1 to sirka do
  157. begin
  158. if (i=zaciatok.m) and (j=zaciatok.n) then setfillstyle(1,green)
  159. else if (i=ciel.m) and (j=ciel.n) then setfillstyle(1,green)
  160. else
  161. if bludisko[i,j].cesta=true then
  162. setfillstyle(1,green) else
  163. if bludisko[i,j].bolSom=true then
  164. setfillstyle(1,yellow) else
  165. if bludisko[i,j].prekazka=true then
  166. setfillstyle(1,red) else
  167. setfillstyle(1,white);
  168. bar((j-1)*max,(i-1)*max,(j)*max,(i)*max);
  169. if (i=zaciatok.m) and (j=zaciatok.n) then begin setfillstyle(1,black); moveto((j-1)*max+max div 2,(i-1)*max+max div 2); outtext('Z'); end
  170. else if (i=ciel.m) and (j=ciel.n) then begin setfillstyle(1,black); moveto((j-1)*max+max div 2,(i-1)*max+max div 2); outtext('C'); end
  171. end;
  172. end;
  173. procedure vykresliCestu(m,n:integer);
  174. begin
  175. if (m=zaciatok.m) and (n=zaciatok.n) then exit;
  176. bludisko[m,n].cesta:=true;
  177. vykresliCestu(bludisko[m,n].parent.m,bludisko[m,n].parent.n);
  178. end;
  179.  
  180. procedure najdiNajkratsiuCestu(m,n:integer);
  181. begin
  182. if q4='y' then vypisBludiskaGraphom;
  183. if kon<index then exit;
  184. if (m=ciel.m) and (n=ciel.n) then najdene:=true;
  185. if najdene then begin vykresliCestu(bludisko[m,n].parent.m,bludisko[m,n].parent.n); exit; end;
  186. if kon<index then exit;
  187. if (m+1>=1) and (m+1<=vyska) and (n>=1) and (n<=sirka) and (bludisko[m+1,n].prekazka=false) and (bludisko[m+1,n].bolSom=false) then
  188. begin
  189. kon:=kon+1;
  190. bunky[kon].m:=m+1;
  191. bunky[kon].n:=n;
  192. bludisko[m+1,n].bolSom:=true;
  193. bludisko[m+1,n].parent.m:=m;
  194. bludisko[m+1,n].parent.n:=n;
  195. end;
  196. if (m>=1) and (m<=vyska) and (n+1>=1) and (n+1<=sirka) and (bludisko[m,n+1].prekazka=false) and (bludisko[m,n+1].bolSom=false) then
  197. begin
  198. kon:=kon+1;
  199. bunky[kon].m:=m;
  200. bunky[kon].n:=n+1;
  201. bludisko[m,n+1].bolSom:=true;
  202. bludisko[m,n+1].parent.m:=m;
  203. bludisko[m,n+1].parent.n:=n;
  204. end;
  205. if (m-1>=1) and (m-1<=vyska) and (n>=1) and (n<=sirka) and (bludisko[m-1,n].prekazka=false) and (bludisko[m-1,n].bolSom=false) then
  206. begin
  207. kon:=kon+1;
  208. bunky[kon].m:=m-1;
  209. bunky[kon].n:=n;
  210. bludisko[m-1,n].bolSom:=true;
  211. bludisko[m-1,n].parent.m:=m;
  212. bludisko[m-1,n].parent.n:=n;
  213. end;
  214. if (m>=1) and (m<=vyska) and (n-1>=1) and (n-1<=sirka) and (bludisko[m,n-1].prekazka=false) and (bludisko[m,n-1].bolSom=false) then
  215. begin
  216. kon:=kon+1;
  217. bunky[kon].m:=m;
  218. bunky[kon].n:=n-1;
  219. bludisko[m,n-1].bolSom:=true;
  220. bludisko[m,n-1].parent.m:=m;
  221. bludisko[m,n-1].parent.n:=n;
  222. end;
  223. index:=index+1;
  224. najdiNajkratsiuCestu(bunky[index].m,bunky[index].n);
  225.  
  226. end;
  227. {
  228. procedure najdiCestu(m,n:integer);
  229. begin
  230.  
  231. if (m=vyska) and (n=sirka) then najdene:=true;
  232. if (m<1) or (m>vyska) or (n<1) or (n>sirka) or (bludisko[m,n]='#') or (bolSom[m,n]) or najdene then exit;
  233. bolSom[m,n]:=true;
  234. bludisko[m,n]:='O';
  235. if striedanie then
  236. begin striedanie:=false; najdiCestu(m+1,n); najdiCestu(m,n+1); end
  237. else begin striedanie:=true; najdiCestu(m,n+1); najdiCestu(m+1,n); end;
  238. najdiCestu(m-1,n);
  239. najdiCestu(m,n-1);
  240. if najdene then bludisko[m,n]:='=';
  241. end;
  242. }
  243. procedure vypisPola(a:pole);
  244. var i,j:integer;
  245. begin
  246. for i:=1 to velkost do
  247. begin
  248. for j:=1 to velkost do
  249. write(a[i,j]:3);
  250. writeln;
  251. end;
  252. readln();
  253. end;
  254.  
  255. procedure skacKonom(por,surX,surY:integer);
  256. var k,u,v:integer;
  257. begin
  258. k:=0;
  259. repeat
  260. inc(k);
  261. u:=surX+m[k];
  262. v:=surY+n[k];
  263. if (u>0) and (v>0) and (u<=velkost) and (v<=velkost) and (h[u,v]=0) then
  264. begin
  265. h[u,v]:=por;
  266. if por<velkost*velkost then
  267. begin
  268. skacKonom(por+1,u,v);
  269. if q2=false then h[u,v]:=0;
  270. end
  271. else q2:=true;
  272. end;
  273. until q2 or (k=8);
  274. end;
  275. procedure initHorse;
  276. var i,j:integer;
  277. begin
  278. m[1]:=2; n[1]:=1;
  279. m[2]:=1; n[2]:=2;
  280. m[3]:=-1; n[3]:=2;
  281. m[4]:=-2; n[4]:=1;
  282. m[5]:=-2; n[5]:=-1;
  283. m[6]:=-1; n[6]:=-2;
  284. m[7]:=1; n[7]:=-2;
  285. m[8]:=2; n[8]:=-1;
  286. for i:=1 to 8 do
  287. for j:=1 to 8 do
  288. h[i,j]:=0;
  289. h[1,1]:=1;
  290. end;
  291.  
  292.  
  293. procedure menu;
  294. begin
  295. writeln('1. problem 8 dam');
  296. writeln('2. problem jazdca na schovnici');
  297. writeln('3. prechod bludiskom');
  298. writeln('9. koniec');
  299. end;
  300. begin
  301. randomize;
  302. repeat
  303. clrscr;
  304. menu;
  305. z:=readkey();
  306. case z of
  307. '1':
  308. begin
  309. for i:=1 to 8 do a[i]:=true;
  310. for i:=2 to 16 do b[i]:=true;
  311. for i:=-7 to 7 do c[i]:=true;
  312. writeln('zadaj velkost sachovnice');
  313. readln(velkost);
  314. skus(1);
  315. if q then
  316. for i:=1 to velkost do write(x[i],' ')
  317. else writeln('riesenie neexistuje');
  318. writeln;
  319. writeln('stlac lubovolnu klavesu');
  320. readln;
  321. q:=false;
  322. end;
  323. '2':begin
  324. q2:=false;
  325. initHorse();
  326. writeln('zadaj velkost sachovnice');
  327. readln(velkost);
  328. skacKonom(2,1,1);
  329. if q2 then vypisPola(h)
  330. else writeln('reisenie neexistuje');
  331. end;
  332. '3': begin
  333. writeln('zadaj vysku sachovnice');
  334. readln(vyska);
  335. writeln('zadaj sirku sachovnice');
  336. readln(sirka);
  337. writeln('chcete zadat suradnice zaciatku a ciela?(y/n)');
  338. writeln('Ak nie, budu suradnice zaciatku vlavo-hore a suradnice ciela vpravo-dole');
  339. readln(q3);
  340. if q3='y' then
  341. begin
  342. writeln('zadajte suradnice zaciatku');
  343. readln(zaciatok.m,zaciatok.n);
  344. writeln('zadajte suradnice ciela');
  345. readln(ciel.m,ciel.n);
  346. end
  347. else
  348. begin
  349. zaciatok.m:=1;
  350. zaciatok.n:=1;
  351. ciel.m:=vyska;
  352. ciel.n:=sirka;
  353. end;
  354. writeln('zadaj pocet prekazok');
  355. readln(prekazky);
  356. writeln('chcete vidiet v realnom case kroky pocitaca?(y/n)'); writeln('pri rozmeroch bludiska nad 30 neodporucam zapinat tuto funkciu z dovodu dlheho trvana behu programu kvoli vykreslovaniu');
  357. readln(q4);
  358. najdene:=false;
  359. //for i:=2 to vyska-1 do
  360.  
  361. //for j:=2 to sirka-1 do
  362. //bolSom[i,j]:=false;
  363. generujBludisko(prekazky);
  364. index:=1;
  365. kon:=1;
  366. bunky[1].m:=zaciatok.m;
  367. bunky[1].n:=zaciatok.n;
  368. bludisko[zaciatok.m,zaciatok.n].bolSom:=true;
  369. detectgraph(gd,gm);
  370. initgraph(gd,gm,'');
  371. najdiNajkratsiuCestu(bunky[1].m,bunky[1].n);
  372.  
  373. clrscr;
  374. vypisBludiska;
  375. vypisBludiskaGraphom();
  376. if najdene=false then writeln('cesta neexistuje');
  377. readln;
  378. end;
  379. end;
  380. until z='9';
  381.  
  382.  
  383.  
  384.  
  385. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement