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