Localize file www.TrSek.com/pas/terclight.pas
{ 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.

Copyrigth by Zdeno Sekerak 2007, http://www.trsek.com