; j1 P" ], c0 V' BTi l e B o a r d函数的调用格式为Ti l e B o a r d(0,0, dr, dc,size),其中s i z e = 2k。覆盖残缺棋盘所需要的三格板数目为( s i z e2 -1 ) / 3。函数TileBoard 用整数1到( s i z e2-1 ) / 3来表示这些三格板,并用三格板的标号来标记被该三格板覆盖的非残缺方格。2 u A+ b7 {0 ]+ f' Z: R
0 @8 g4 Y3 q6 H' Z |; C1 ^) q令t (k) 为函数Ti l e B o a r d覆盖一个2k×2k 残缺棋盘所需要的时间。当k= 0时,s i z e等于1,覆盖它将花费常数时间d。当k > 0时,将进行4次递归的函数调用,这些调用需花费的时间为4t (k-1 )。除了这些时间外, if 条件测试和覆盖3个非残缺方格也需要时间,假设用常数c 表示这些额外时间。可以得到以下递归表达式: ( g; v( x) \* M4 P4 E ^# P) ?/ a2 d
程序14-2 覆盖残缺棋盘% E' z/ h' F7 q/ V* K u! Y0 ]
; `& G1 R( L3 q v& Q3 b% X2 t8 I4 Wvoid TileBoard(int tr, int tc, int dr, int dc, int size) ) F( j( {* n& ?7 @5 T" x/ `. p8 z9 U- b* p) h1 Z3 a+ P! q
{// 覆盖残缺棋盘 8 ?2 G: I1 b- m* V/ B* g$ D# {; [$ |/ |# }$ U: K
if (size == 1) return;$ H1 N, X0 R6 b" J! _8 s$ y
, i3 m1 q! h# v: t5 P6 G" v$ f
int t = tile++, // 所使用的三格板的数目9 B8 X6 h+ y8 d) G
' Z( V C4 f( a. t4 r: G# E
s = size/2; // 象限大小 B V0 ^: w0 @- n: c* Q
3 r. y& V5 ]& X2 {
/ /覆盖左上象限 & d5 l7 X+ Y5 T. V& i- E' x; a& x- K# v2 ~
if (dr < tr + s && dc < tc + s)0 f3 G/ O1 t6 y1 ^
" g. ]) a7 O8 W0 l// 残缺方格位于本象限 3 Z4 F; a, M2 r" w4 E8 v9 e7 M6 E6 P! q) Y
Ti l e B o a r d ( t r, tc, dr, dc, s); 6 t. i: c( ?- W5 N5 o 9 l/ T" @1 H: w. @9 A5 X$ y6 q4 z2 kelse {// 本象限中没有残缺方格 , @4 Q) {4 ^" Z! p8 o) Z( a$ t$ c3 Z# [( P& Q- P
// 把三格板t 放在右下角& u* Y8 l, t) r* L/ z% |
K% P7 ^9 X4 j1 @) H
Board[tr + s - 1][tc + s - 1] = t; + |- K, f8 v4 t# e" }) V5 {0 [8 Z9 p0 j! y* N
// 覆盖其余部分 5 E) b) Y) `2 ~" y1 f+ Q/ q! ]) W8 x; |5 ~( t b
Ti l e B o a r d ( t r, tc, tr+s-1, tc+s-1, s);} . {8 y6 r$ y# d0 S7 ^ : \6 C3 I3 ^1 ]* d& E9 O; s( i9 H H/ /覆盖右上象限 0 R+ R8 s) F8 {$ L8 B7 Q1 x, Y* k, _7 ^- F1 ]3 P5 l
if (dr < tr + s && dc >= tc + s) $ R2 W& `! ~' d$ z3 [ ) [8 m( W/ M6 K; `$ d3 d// 残缺方格位于本象限 7 c; k l- {/ s4 k7 O ( O) v. R! x' l. a- tTi l e B o a r d ( t r, tc+s, dr, dc, s);3 r9 m3 p% `9 ]6 ^5 u' V
+ N9 D m9 g3 n- ^! b7 N9 W: Z
else {// 本象限中没有残缺方格 7 o! W3 J+ K5 g% ~, q7 p" z2 X9 R. l
// 把三格板t 放在左下角* p; u: T$ ~( Y& A- S
( n7 o- f' X$ E" W: G4 Z
Board[tr + s - 1][tc + s] = t;1 R- O$ P# r* K! r. g, E% O/ F) R
" f1 x, |" O- Z$ Z4 @3 A4 c! F6 M! o$ p
// 覆盖其余部分* [6 J- s9 t0 Y# d, O
# O4 y# a3 o+ u ` V' \/ Z
Ti l e B o a r d ( t r, tc+s, tr+s-1, tc+s, s);} ) D& B% }9 k0 N0 q; B) E 8 `# F F# p7 d. j/ /覆盖左下象限 d. N% H) L% P1 F. \2 B
. V# X `7 b: b1 o
if (dr >= tr + s && dc < tc + s) : I0 a# P) O; E $ I/ t4 h9 m2 ` O// 残缺方格位于本象限 % d `7 n- H+ U0 { 9 [; J2 C1 `( r* O$ gTileBoard(tr+s, tc, dr, dc, s); # r' ] z! K Q) W- S4 A# v, ~" r# V
else {// 把三格板t 放在右上角8 F/ F, f e. _3 e
7 Q+ a F5 X4 K s8 X. m" XBoard[tr + s][tc + s - 1] = t; * Q# e$ q. b r& L4 l) V4 Q3 d 8 F1 N. r: Q& \: `8 S$ \// 覆盖其余部分 3 p& v& E' G) x/ w( L 3 c; D( G7 U( v9 r' mTileBoard(tr+s, tc, tr+s, tc+s-1, s);}/ v5 K: j0 Z- X3 @
. q0 S* @& ~! Q+ `! O( R- X1 S
// 覆盖右下象限 ) t$ Z9 g# j4 H+ b ) |2 `3 A4 |2 m- ?( o$ J/ b4 y. tif (dr >= tr + s && dc >= tc + s)3 `4 o0 \3 `" {2 T4 A3 O# r
3 j h6 ^6 F/ }- s1 h
// 残缺方格位于本象限& B, Z- o* I% Y/ Y& Z
, N% d6 Y+ a' B* D" N: V
TileBoard(tr+s, tc+s, dr, dc, s);9 v2 N. B. u+ n0 S/ u4 b
7 A8 q+ p1 i' z5 D' K
else {// 把三格板t 放在左上角 / Z$ Z7 ]% ]( `) r1 o: E$ Q% R8 v4 B8 s
Board[tr + s][tc + s] = t;$ B, M0 C$ [9 m# M* P: d
" [9 v( D/ }; u% g4 a) {
// 覆盖其余部分4 }0 z' v, c' p( }5 c8 W