Problema combinari

Pascal este un limbaj imperativ, creat inițial pentru a ajuta la predarea noțiunilor de programare structurati studenților. Delphi, urmașul lui Pascal, este un mediu de dezvoltare pentru aplicații Windows. Delphi este primul limbaj de programare (Object Pascal, mai exact) care a îmbinat ușurința în programare a limbajelor de nivel înalt și puterea uneltelor de lucru de nivel scăzut într-un mediu RAD.

Problema combinari

Postby sharky92 » 23 Dec 2010, 12:19

De cateva zile am inceput sa fac probleme de pe infoarena.ro , si m-am "impotmolit" un pic la problema combinarilor de N luate cate K. Prima sursa am facut-o eu si am primit 0 puncte pe ea, apoi de curiozitate am copiat problema combinarilor din manualul de clasa 10, modificand cateva date pentru a corespunde cerintelor celor de pe infoarena.ro si am trimis-o spre evaluare. Din cele 10 teste facute, in 9 a dat raspunsuri gresite si intr-un test a depasit timpul limita.
Imi poate spune cineva ce nu e bine la sursa mea :

  1. Program combinari;
  2. Type vector=array[1..25] of integer;
  3. var St:vector; n,k:integer;  Fo,FI:text;
  4.  
  5. procedure initializare;           {initializam stiva cu 0}
  6. var i:integer;
  7. begin
  8. For i:=1 to  25 do St[i]:=0;
  9. end;
  10.  
  11.  
  12.  
  13.  
  14. Procedure Tipar (p:integer);                            {tiparim o solutie valida}
  15. var j:integer;
  16. begin
  17.     for j:=1 to p do
  18.         write(FO,St[j]:4,' ');
  19.         writeln(FO);
  20. end;
  21.  
  22. Function Valid(p:integer):boolean;                                 {verificam dac o solutie este valida sau nu }
  23. var i:integer;
  24. begin
  25.     if (P>1) and (St[p]<=St[p-1]) then valid:=false
  26.                                   else valid:=true;
  27. end;
  28.  
  29. Procedure bktr(p:integer);                                               {procedura recursiva pentru combinari}
  30. var pval:integer;
  31. begin
  32.     for pval:=1 to n do
  33.         begin
  34.         St[p]:=pval;
  35.             if valid(p) then
  36.                 if p=k then
  37.                 Tipar(P)
  38.                 else
  39.                 bktr(p+1);
  40.         end;
  41. end;
  42.  
  43. Begin
  44. initializare;
  45. Assign(FI,'combinari.in'); reset(FI);
  46. Assign(FO,'combinari.out'); rewrite(FO);
  47. readln(FI,N,K);                                                                {citim N si K din fisierul text}
  48. close(FI);
  49. Bktr(1);
  50. close(FO);
  51. end.



Mentionez ca ambele surse le-am compilat pe calculatorul meu si functioneaza foarte bine. Va multumesc.
0,0p / 0 votes
User avatar
sharky92
Bit
 
Joined: 09 Nov 2010
Status: 2

Re: Problema combinari

Postby DarkByte » 23 Dec 2010, 12:29

Sincer, e prea dimineata (si prea la inceput de concediu) pentru mine ca sa ma apuc de verificat back-tracking ...

Fa niste teste si vezi ce si cum.

Singura chestie care-mi sare in ochi la o prima privire e "afisarea" ta. Tu afisezi fiecare element din solutie pe patru pozitii, incearca sa lasi doar un spatiu intre elemente (stiu, n-ar trebui sa comenteze evaluatorul din cauza asta, but who knows).
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Problema combinari

Postby sharky92 » 23 Dec 2010, 21:22

Multumesc , am reusit sa rezolv problema .
0,0p / 0 votes
User avatar
sharky92
Bit
 
Joined: 09 Nov 2010
Status: 2

Re: Problema combinari

Postby smith » 23 Dec 2010, 21:37

Pot să văd și eu rezolvarea cu enunțul? Poate mai sunt curioși :D
0,0p / 0 votes
Ilea Cristian
User avatar
smith
Enum
 
Joined: 29 Dec 2009
Location: Cluj-Napoca
Status: 82

Re: Problema combinari

Postby sharky92 » 23 Dec 2010, 23:11

Enunt : Sa se genereze toate combinarile de N luate cate K in ordine lexicografica.
Rezolvare :

  1. Program combinari;
  2. var s:array[0..20] of longint;
  3.     n,k:longint;
  4.  
  5. procedure back(l:longint);
  6. var i:longint;
  7. begin
  8. if (l=k) then
  9.        begin
  10.         for i:=1 to k do
  11.                 write(s[i],' ');
  12.         writeln;
  13.         end
  14. else
  15.       begin
  16.        for i:=s[l]+1 to n do
  17.                begin
  18.                s[l+1]:=i;
  19.                back(l+1);
  20.                end;
  21.         end;
  22. end;
  23.  
  24. begin
  25. assign(input,'C:\Documents and Settings\Roland\Desktop\sums\in.txt');reset(input);
  26. assign(output,'C:\Documents and Settings\Roland\Desktop\sums\out.txt');rewrite(output);
  27. readln(n,k);
  28. back(0);
  29. close(input);close(output);
  30. end.
0,0p / 0 votes
User avatar
sharky92
Bit
 
Joined: 09 Nov 2010
Status: 2

Re: Problema combinari

Postby andreiandreiq » 23 Dec 2010, 23:57

@sharky92: Nu cumva ai uitat sa pui " input,output:text; " ? :-?
0,0p / 0 votes
Image
User avatar
andreiandreiq
Word
 
Joined: 30 Dec 2009
Status: 33.33

Re: Problema combinari

Postby sharky92 » 24 Dec 2010, 00:20

Nu...input si output sunt default in Pascal....cand afisezi cu write pe ecran, scrii intr-un fisier, denumit, standard, output , deci daca redirectezi output catre un fisier, scrii in fisier direct.
0,0p / 0 votes
User avatar
sharky92
Bit
 
Joined: 09 Nov 2010
Status: 2


Return to Pascal / Delphi

Who is online

Users browsing this forum: No registered users and 0 guests