{ Akymi kombinaciami zasahov sa da dosiahnut definovany pocet bodov } { Zadanie: } { - Pocet medzikruzi v terci M } { - Bodove hodnoty jednotlivych medzikruzi B[1] .. B[M] } { - Celkovy pocet vystrelov V } { - Celkovy pocet nastrielanych bodov v terci Z } program terc; uses crt,dos; const MAX_M=20; var m:integer; { pocet medzikruzi, globalna premenna } v:integer; { pocet vystrelov, globalna premanna } z:integer; { celkovy pocet nastrielanych bodov } i:integer; { pomocna premenna } poc:integer; { pocet rieseni } b:array [1..MAX_M] of integer; { hodnoty medzikruzi } vv:array [1..MAX_M] of integer; { vektor riesenia } { najtazsia cast programu } { bude generovat jednotlive kombinacie zasahov } function DalsiVektor:boolean; var i:integer; begin i:=m; { budeme pouzivat tuto premennu } vv[i]:=vv[i]+1; { zvysim hodnotu posledneho } DalsiVektor:=true; { pokial mi presahuje pocet vystrelov v } { zmenim na 0 a zvacsim dalsie medzikruzie v poradi } while( vv[i]>v ) do begin vv[i]:=0; { test ci mozem zmenit dalsie } if( i=1 )then begin DalsiVektor:=false; { uz som na konci } end else begin i:=i-1; { menim dalsie medzikruzie } vv[i]:=vv[i]+1; end; end; { while } end; { funkcia zisti celkovy pocet vystrelov } function PocetVystr:integer; var poc:integer; begin poc:=0; for i:=1 to m do poc:=poc+ vv[i]; PocetVystr:=poc; end; { funkcia zisti kolko ma vektor bodov } function PocetBodov:integer; var i:integer; vys:integer; begin vys:=0; for i:=1 to m do vys:=vys+ vv[i]*b[i]; PocetBodov:=vys; end; { vypise pozadovany vektor } procedure VypisVektor; var i:integer; begin Write('('); for i:=1 to m do begin if (i=m) then Write(vv[i],')') else Write(vv[i],','); end; WriteLn; end; BEGIN { uvod } ClrScr; WriteLn('Program na zistenie kombinacii zasahov pre dosiahnutie poctu bodov.'); WriteLn; { zistenie pociatocnych hodnot } Write('Zadaj pocet medzikruzi v terci (max=', MAX_M, '):'); ReadLn(m); for i:=1 to m do begin Write('Zadaj hodnotu medzikruzia B[',i,']='); ReadLn(b[i]); end; WriteLn; Write('Zadaj celkovy pocet vystrelov:'); ReadLn(v); Write('Zadaj pozadovany pocet nastrielanych bodov:'); ReadLn(z); { nastavim default hodnoty - znulujem } for i:=1 to MAX_M do vv[i]:=0; poc:=0; { zacneme riesit ulohu } WriteLn; while( DalsiVektor ) do begin { kontrola vektora } if( PocetVystr=v ) then { pocet vystrelov OK } if( PocetBodov=z )then { pocet bodov OK } begin inc(poc); Write('Riesenie ',poc:2,': '); VypisVektor; end; end; { zhodnoti kolko nasiel rieseni } if( poc=0 )then WriteLn('Pre zadane hodnoty neexistuje ziadne riesenie.') else WriteLn('Celkovo najdene ', poc, ' krat.'); END.