1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const int DX[] = { 1, 0, -1, 0 };
const int DY[] = { 0, 1, 0, -1 }; // DY = DX[(i + 3) % 4]
void step(int x, int y) {
printf("x=%d, y=%d\n", x, y);
}
void walk(int xMax, int yMax) {
// A chaque itération, on ressert le contour à parcourir.
for (int x1 = 0, y1 = 0, x2 = xMax, y2 = yMax; x1 < x2 && y1 < y2; ++x1, ++y1, --x2, --y2) {
// On commence en haut à gauche et on réalise un contour complet en 4 étapes.
int x = x1;
int y = y1;
for (int i = 0; i < 4; ++i) {
// Le vecteur précalculé de déplacement à l'étape i.
int dx = DX[i];
int dy = DY[i];
do {
// Dans le cas d'un contour plat (x2-x1=1 et/ou y2-y1=1),
// on ne marque pas les cases en dehors.
if (x1 <= x && x < x2 && y1 <= y && y < y2) {
step(x, y);
}
x += dx;
y += dy;
} while (x1 <= x + dx && x + dx < x2 && y1 <= y + dy && y + dy < y2);
}
}
}
int main(int, char **) {
walk(5, 2);
return EXIT_SUCCESS;
} |
Partager