#include <stdio.h>
void dump(int depth, int y1, int x1, int y2, int x2) {
char indent[depth+1];
for (int i=0; i<depth; ++i)
indent[i] = ' ';
indent[depth] = 0;
printf("%s(%d,%d)(%d,%d)\n", indent, y1, x1, y2, x2);
}
// Assumes y1<=y2 && x1<=x2
void subdivide(int depth, int y1, int x1, int y2, int x2) {
dump(depth, y1, x1, y2, x2);
++depth;
int ym = (y2+y1+1)/2;
int xm = (x2+x1+1)/2;
if (y1!=y2 && x1!=x2) {
if (y1==y2) {
subdivide(depth, y1, x1, y1, xm-1);
subdivide(depth, y1, xm, y1, x2);
}
else if (x1==x2) {
subdivide(depth, y1, x1, ym-1, x1);
subdivide(depth, ym, x1, y2, x1);
}
else {
subdivide(depth, y1, x1, ym-1, xm-1);
subdivide(depth, y1, xm, ym-1, x2);
subdivide(depth, ym, x1, y2, xm-1);
subdivide(depth, ym, xm, y2, x2);
}
}
}
int main(void) {
subdivide(0, 1,1, 8,8);
printf("\n");
subdivide(0, 1,1, 7,7);
return 0;
}
输出:
$ gcc -Wall -Wextra -pedantic --std=c99 -o a a.c && a
(0,0)(7,7)
(0,0)(3,3)
(0,0)(1,1)
(0,0)(0,0)
(0,1)(0,1)
(1,0)(1,0)
(1,1)(1,1)
(0,2)(1,3)
(0,2)(0,2)
(0,3)(0,3)
(1,2)(1,2)
(1,3)(1,3)
(2,0)(3,1)
(2,0)(2,0)
(2,1)(2,1)
(3,0)(3,0)
(3,1)(3,1)
(2,2)(3,3)
(2,2)(2,2)
(2,3)(2,3)
(3,2)(3,2)
(3,3)(3,3)
(0,4)(3,7)
(0,4)(1,5)
(0,4)(0,4)
(0,5)(0,5)
(1,4)(1,4)
(1,5)(1,5)
(0,6)(1,7)
(0,6)(0,6)
(0,7)(0,7)
(1,6)(1,6)
(1,7)(1,7)
(2,4)(3,5)
(2,4)(2,4)
(2,5)(2,5)
(3,4)(3,4)
(3,5)(3,5)
(2,6)(3,7)
(2,6)(2,6)
(2,7)(2,7)
(3,6)(3,6)
(3,7)(3,7)
(4,0)(7,3)
(4,0)(5,1)
(4,0)(4,0)
(4,1)(4,1)
(5,0)(5,0)
(5,1)(5,1)
(4,2)(5,3)
(4,2)(4,2)
(4,3)(4,3)
(5,2)(5,2)
(5,3)(5,3)
(6,0)(7,1)
(6,0)(6,0)
(6,1)(6,1)
(7,0)(7,0)
(7,1)(7,1)
(6,2)(7,3)
(6,2)(6,2)
(6,3)(6,3)
(7,2)(7,2)
(7,3)(7,3)
(4,4)(7,7)
(4,4)(5,5)
(4,4)(4,4)
(4,5)(4,5)
(5,4)(5,4)
(5,5)(5,5)
(4,6)(5,7)
(4,6)(4,6)
(4,7)(4,7)
(5,6)(5,6)
(5,7)(5,7)
(6,4)(7,5)
(6,4)(6,4)
(6,5)(6,5)
(7,4)(7,4)
(7,5)(7,5)
(6,6)(7,7)
(6,6)(6,6)
(6,7)(6,7)
(7,6)(7,6)
(7,7)(7,7)
(0,0)(6,6)
(0,0)(2,2)
(0,0)(0,0)
(0,1)(0,2)
(0,1)(0,1)
(0,2)(0,2)
(1,0)(2,0)
(1,0)(1,0)
(2,0)(2,0)
(1,1)(2,2)
(1,1)(1,1)
(1,2)(1,2)
(2,1)(2,1)
(2,2)(2,2)
(0,3)(2,6)
(0,3)(0,4)
(0,3)(0,3)
(0,4)(0,4)
(0,5)(0,6)
(0,5)(0,5)
(0,6)(0,6)
(1,3)(2,4)
(1,3)(1,3)
(1,4)(1,4)
(2,3)(2,3)
(2,4)(2,4)
(1,5)(2,6)
(1,5)(1,5)
(1,6)(1,6)
(2,5)(2,5)
(2,6)(2,6)
(3,0)(6,2)
(3,0)(4,0)
(3,0)(3,0)
(4,0)(4,0)
(3,1)(4,2)
(3,1)(3,1)
(3,2)(3,2)
(4,1)(4,1)
(4,2)(4,2)
(5,0)(6,0)
(5,0)(5,0)
(6,0)(6,0)
(5,1)(6,2)
(5,1)(5,1)
(5,2)(5,2)
(6,1)(6,1)
(6,2)(6,2)
(3,3)(6,6)
(3,3)(4,4)
(3,3)(3,3)
(3,4)(3,4)
(4,3)(4,3)
(4,4)(4,4)
(3,5)(4,6)
(3,5)(3,5)
(3,6)(3,6)
(4,5)(4,5)
(4,6)(4,6)
(5,3)(6,4)
(5,3)(5,3)
(5,4)(5,4)
(6,3)(6,3)
(6,4)(6,4)
(5,5)(6,6)
(5,5)(5,5)
(5,6)(5,6)
(6,5)(6,5)
(6,6)(6,6)