Remplir un carré en diagonale

 

Supposons qu'on a un carré de 10x10 cases, et qu'on veut noircir toutes ses cases; le remplissage ne s'effectuera pas en ligne ou en colonne mais en diagonale, de gauche à droite et du bas vers le haut.

Pour cela, si à un instant t on se trouve à la case de coordonnées (x,y), alors la prochaine case à noircir sera la case de coordonnées (x+1,y-1).

Il faut prendre soin de tester les effets de bord (ne pas sortir du carré à force de décrémenter x ou d'incrémenter y).

On en déduit donc que le point d'arrêt de la procédure est atteint quand les coordonnées x ou y se retrouvent en dehors du carré.

On sait ensuite que lorsqu'on aura atteint la première ligne (y=1), alors il faut redémarrer le remplissage à la première colonne.

 

procedure trace(x, y, x_droite, y_bas, total_posees: integer);
begin
  tab[x, y] := '$';
  afficher_tableau;
  if (x >= dim) and (y >= dim) then exit; // point d'arrêt
  if y = 1 then
  begin
    if x >= dim then inc(x_droite); // effet de bord
    x := x_droite;
    y := y_bas + 1;
    if y > dim then dec(y); // effet de bord
    y_bas := y;
    if total_posees < dim * dim then // carré rempli ?
      trace(x, y, x_droite, y_bas, total_posees + 1);
  end
  else
    if x >= dim then
    begin
      if y_bas = dim then inc(x_droite); // effet de bord
      x := x_droite; y := y_bas;
      if total_posees < dim * dim then // carré rempli ?
        trace(x, y, x_droite, y_bas, total_posees + 1);
    end
    else
      if total_posees < dim * dim then // carré rempli ?
        trace(x + 1, y - 1, x_droite, y_bas, total_posees + 1);
end;
 

On appelle cette procédure avec l'instruction suivante: "trace(1,1,1,1,1);".

 

Télécharger le code source Delphi