- j* E0 c# v: \- C3 {Ti 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来表示这些三格板,并用三格板的标号来标记被该三格板覆盖的非残缺方格。 0 g! A0 e+ {4 V% D/ p- R( S( R2 Y8 p. Z8 w7 K
令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 表示这些额外时间。可以得到以下递归表达式:" I( a2 _( _# Q, _' t3 k
. ~) i* i6 h2 k, j7 I程序14-2 覆盖残缺棋盘* Z# H: t8 Z. ^& J. V9 u8 f
% [/ S, P+ O% tvoid TileBoard(int tr, int tc, int dr, int dc, int size)1 j- p0 h4 |! l
1 ?. @) a1 ~- u2 p6 r4 f) i{// 覆盖残缺棋盘 " r3 A s. J) f: H5 R- b7 S: q u# r" u
if (size == 1) return; # V3 b2 [2 |! \7 b: s 9 C; f& s/ K2 _* Jint t = tile++, // 所使用的三格板的数目8 _8 M1 ?4 J8 G3 g* p5 S
2 U; y, i: d) K% e Q1 Qs = size/2; // 象限大小& {) h& @: n9 h* M, ~4 b
) P2 T- ~$ x- |; ]# n1 s2 n% F1 H
/ /覆盖左上象限 * N, q7 l. F, @7 u3 e 9 n$ E$ j* w5 Dif (dr < tr + s && dc < tc + s)1 G* ^( H- S. b/ p" C4 R
J* ?) g- U$ O// 残缺方格位于本象限7 G2 x; }# P% z% ?! I7 W: X
# T+ j4 e- F+ H( i, r) o% \* ^$ A
Ti l e B o a r d ( t r, tc, dr, dc, s); ; R8 p. @6 P8 |0 o1 O' i" y' ~ H1 v4 X
else {// 本象限中没有残缺方格 : |" c- B$ o0 W ( e p% P0 i* n0 Q. w" U// 把三格板t 放在右下角9 i( d( Q6 O0 V2 A2 ~
/ O( v3 ?' D r" V2 C) t/ Z2 P- T+ M4 p
Board[tr + s - 1][tc + s - 1] = t; - H3 C# `7 [- s 7 N9 v$ J2 A' y& V4 i/ t2 r// 覆盖其余部分 9 O( x8 m7 d! O7 K6 g6 b 0 g6 j1 z& r+ `' o- xTi l e B o a r d ( t r, tc, tr+s-1, tc+s-1, s);} 4 Y/ B( j% V5 c9 F, l E+ D& R. Y ! A- X4 w: {: Y8 @! d! D/ /覆盖右上象限 2 t: K1 `: C1 W2 q 8 z1 d9 L6 Z+ m1 Uif (dr < tr + s && dc >= tc + s)% u! O* B$ i) x) S6 J: {6 e
1 L* l( V# }9 J
// 残缺方格位于本象限 / z$ l- f* H0 \; f6 z" o8 Z5 |8 ~5 Q# N6 y `( B( c. w& g) @0 j
Ti l e B o a r d ( t r, tc+s, dr, dc, s); $ ]) L K$ n$ [. X/ @8 F " K2 A- E7 p. s; celse {// 本象限中没有残缺方格# G/ `# Q V' ~# v7 T4 _, Q9 r' q2 b
/ d2 r& k' Z% j6 j// 把三格板t 放在左下角" J; O( b) z9 d6 X8 W
1 G4 D: I, I) g% QBoard[tr + s - 1][tc + s] = t; 3 u. w# p+ X( I1 L8 m9 J" Q' H1 c
// 覆盖其余部分: G' R0 X& o4 J2 \2 E7 ~
1 Z$ J6 H4 I) x2 O& H2 h
Ti l e B o a r d ( t r, tc+s, tr+s-1, tc+s, s);} - w3 F. q% J4 m/ ]) H. q ( [( d! r0 J9 v/ /覆盖左下象限+ k: u$ n3 j! e7 K, w: X
4 y; \% k" s& fif (dr >= tr + s && dc < tc + s)& U: i4 f1 C# w, v4 v
) g- J: A c7 m7 l' I5 J4 d3 d, c" G, t
// 残缺方格位于本象限 ; X8 w3 V' _. e4 Q% Y" V# c* { 5 K( P" v' W1 CTileBoard(tr+s, tc, dr, dc, s); 9 |& s( B% C, | + w4 o5 g# C8 f2 U& H8 K6 Y$ _. Lelse {// 把三格板t 放在右上角 ) R( d1 |2 X; D# _7 }' q2 g/ h5 E( E q5 E& b7 |) P+ F- X4 R h
Board[tr + s][tc + s - 1] = t;& Q0 ], ^. p3 m% \, n