fork download
  1. program soitario;
  2. uses Math;
  3. var N,M,i,j, soluzione, con_x, senza_x, nuovariga, nuovacolonna:longint;
  4. griglia:array[0..12,0..12] of longint;
  5.  
  6. function gioca(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 gioca:=false
  10. (*tris orizzontale*)
  11. else if (r-2>=0) and (griglia[r-2][c]=1) and (griglia[r-1][c]=1) then gioca:=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 gioca:=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 gioca:=false
  16. else gioca := true;
  17. end;
  18. function riempi (riga, colonna:longint):longint;
  19. begin
  20.  
  21. if griglia[riga,colonna]=-1 then
  22. begin
  23. if colonna+1=M then begin if riga<N-1 then nuovariga:=riga+1
  24. else exit; end
  25. else nuovariga:=riga;
  26. if colonna<N then nuovacolonna:= (colonna+1) mod M;
  27. (*Se posso, metto la X*)
  28. if gioca (riga,colonna)=true then
  29. begin
  30. griglia[riga,colonna]:=1;
  31.  
  32. con_x:= 1 + Riempi(nuovariga,nuovacolonna);
  33. (* Reset della griglia[riga][col]*)
  34.  
  35. end;
  36. (* Non metto la X*)
  37. griglia[riga][colonna]:=0;
  38. senza_x:= Riempi(nuovariga,nuovacolonna);
  39. (*Ritorno la soluzione migliore*)
  40.  
  41. griglia[riga,colonna]:=max(con_x, senza_x);
  42. riempi:=griglia[riga,colonna]
  43. end;
  44. riempi:=griglia[riga,colonna] ;
  45.  
  46. end;
  47. begin
  48. readln(N,M);
  49. for i:=0 to N do
  50. for j:=0 to M do griglia[i,j]:=-1;
  51. writeln(riempi(0 ,0));
  52. end.
  53.  
Success #stdin #stdout 0.01s 5280KB
stdin
4 6
stdout
5