fork download
  1. program solitario;
  2. uses Math;
  3. var N,M,i,j, soluzione, con_x, senza_x, nuovariga, nuovacolonna:longint;
  4. griglia:array[-1..12,-1..12] of longint;
  5.  
  6. function posso(r, c: longint): boolean;
  7. begin
  8. (*tris orizzontale*)
  9. if (c-2>0) and (griglia[r][c-2]=1) and (griglia[r][c-1]=1) then posso:=false
  10. (*tris orizzontale*)
  11. else if (r-2>0) and (griglia[r-2][c]=1) and (griglia[r-1][c]=1) then posso:=false
  12. (* Tris diagonale in alto a sx*)
  13. else if (r-2>0 ) and (c-2>0) and (griglia[r-2][c-2]=1) and (griglia[r-1][c-1]=1) then posso:=false
  14. (* Tris diagonale in alto a dx*)
  15. else if (r-2>0) and (c+2<M) and (griglia[r-2][c+2]=1) and (griglia[r-1][c+1]=1) then posso:=false
  16. else posso := true;
  17. end;
  18. function gioca (riga, colonna:longint):longint;
  19. begin
  20. if riga>N then exit;
  21. if griglia[riga][colonna]<>-1 then gioca:=griglia[riga][colonna];
  22. if colonna+1=M then nuovariga:=riga+1
  23. else nuovariga:=riga;
  24. nuovacolonna:= (colonna+1 ) mod M;
  25. senza_x:= gioca(nuovariga, nuovacolonna);
  26. con_x:=0;
  27. (*Se posso, metto la X*)
  28. if posso (riga,colonna)=true then begin
  29. if colonna+1=M then nuovariga:=riga+1
  30. else nuovariga:=riga;
  31. nuovacolonna:= (colonna+1 ) mod M;
  32.  
  33. con_x:=1+gioca(nuovariga, nuovacolonna);
  34. griglia[riga, colonna]:=-1;
  35. end;
  36. (*Ritorno la soluzione migliore*)
  37. griglia[riga, colonna]:= max(con_x,senza_x);
  38. gioca:=griglia[riga, colonna];
  39. end;
  40. begin
  41. readln(N,M);
  42. for i:=0 to N do
  43. for j:=01 to M do griglia[i,j]:=-1;
  44.  
  45. writeln(gioca(1,1));
  46.  
  47. for i:=1 to N do begin
  48. for j:=1 to M do write(griglia[i,j],' '); writeln; end;
  49. end.
  50.  
Success #stdin #stdout 0s 5276KB
stdin
3 3
stdout
135
135 134 -1 
132 131 -1 
129 128 -1