fork download
  1. program solitario;
  2. uses Math;
  3. var N,M,i,j, a, con_x, senza_x, nuovariga, nuovacolonna, ricorda,ricordatot,totale:longint;
  4. griglia:array[0..12,0..12] of longint;
  5.  
  6. function gioca(r, c: longint): boolean;
  7. begin
  8. (* Tris diagonale in alto a dx*)
  9. 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
  10. else if ((r+2<=N) and (c+2<=M) and (griglia[r+2][c+2]=1) and (griglia[r+1][c+1]=1)) then gioca:=false
  11. else if ((r+2<=N) and (c-2>=0) and (griglia[r+2][c-2]=1) and (griglia[r+1][c-1]=1)) then gioca:=false
  12.  
  13.  
  14. (*tris orizzontale*)
  15. else if (c-2>=0) and (griglia[r][c-2]=1) and (griglia[r][c-1]=1) then gioca:=false
  16. (*tris verticale*)
  17. else if (r-2>=0) and (griglia[r-2][c]=1) and (griglia[r-1][c]=1) then gioca:=false
  18. (* Tris diagonale in alto a sx*)
  19. 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
  20. else gioca := true;
  21. end;
  22. function riempi (riga, colonna, tot:longint):longint;
  23. begin
  24. if riga>=N then riempi(0,colonna+1,tot);
  25.  
  26. if colonna>=M then exit;
  27.  
  28. ricorda:=griglia[riga,colonna];
  29.  
  30. con_x:=0;
  31. if gioca (riga,colonna)=true then
  32. begin
  33. griglia[riga][colonna]:=1;
  34. con_x:= Riempi(riga,colonna+1, tot+1);
  35. (* Reset della griglia[riga][col]*)
  36. if ricorda=0 then griglia[riga, colonna]:=0;
  37. end;
  38. (* Non metto la X*)
  39. if ricorda=0 then senza_x:=Riempi(riga,colonna+1, tot);
  40. (*Ritorno la soluzione migliore*)
  41. riempi:=max(con_x,senza_x);
  42. for i:=0 to N-1 do
  43. for j:=0 to M-1 do
  44. if griglia[i,j]=1 then totale:=totale+1;
  45.  
  46. writeln(totale);
  47.  
  48.  
  49.  
  50.  
  51. for i:=0 to N-1 do begin
  52. for j:=0 to M-1 do
  53. write (griglia[i,j],' ');
  54. writeln
  55. end;
  56. writeln;
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63. end;
  64. begin
  65. readln(N,M);
  66. if M<N then begin a:=N; N:=M; M:=a; end;
  67. if N<=2 then writeln(N* (M-(M div 3)));
  68. ricordatot:=0;
  69. for i:=0 to N-1 do
  70. for j:=0 to M-1 do griglia[i,j]:=0;
  71. totale:=0;
  72. riempi(0,0,0);
  73. end.
  74.  
Success #stdin #stdout 0s 5284KB
stdin
4 4
stdout
2
1 1 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

4
1 1 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

6
1 0 1 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

7
1 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

8
1 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

9
1 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

11
0 1 1 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

12
0 1 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

13
0 1 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

14
0 0 1 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

14
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

14
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

14
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

14
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0