: h9 v, m5 x5 n, s3 N4 R? dr 残缺方块所在行。4 ~ T, ]6 j9 Q( ~
' G1 B8 k! R L+ H5 F
? dl 残缺方块所在列。) `' U. V9 y7 b
6 g+ s, W5 ?. n- b? size 棋盘的行数或列数。! e5 W J0 m/ z
8 O7 X* X c( L6 k8 {! WTi 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来表示这些三格板,并用三格板的标号来标记被该三格板覆盖的非残缺方格。 : X; @2 Z% U X; n* [# d6 G" y7 s
令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 表示这些额外时间。可以得到以下递归表达式:9 @, V" N# F$ I" y
9 g1 i5 X0 g! s" Y6 G3 R* ?
程序14-2 覆盖残缺棋盘# T4 A! ^ c) s4 _ X! a
; q; A. |* L% A# @void TileBoard(int tr, int tc, int dr, int dc, int size)- I* k+ f9 }: p5 z+ [
. @* \ H& F7 ~5 i6 r4 k
{// 覆盖残缺棋盘 3 ?0 O; @: u9 Y0 P. p0 D- Z 9 S1 W- b8 p6 k% oif (size == 1) return;, g" B y4 E! f, X* x
( S- p* J: ?# e6 y* c: Jint t = tile++, // 所使用的三格板的数目7 m. _2 `- ~8 q0 C0 _1 {( o
8 I4 z6 N" F# c3 k& C! ]- u* O
s = size/2; // 象限大小 3 S% i5 A7 d3 C: x1 q2 |$ k0 t' r7 ]% `
/ /覆盖左上象限0 b1 j5 V. a" ^/ h+ |6 X
* j: C& i. H- X* q9 zif (dr < tr + s && dc < tc + s) - e6 J4 p5 H' T- B2 T1 F2 W. o9 V9 \! {
// 残缺方格位于本象限$ W' u+ ?+ [2 {7 C9 U- ^; c" B# U
9 l @8 J; _, y' Z' U
Ti l e B o a r d ( t r, tc, dr, dc, s);( E9 A q- Q3 g3 U- D$ I" o Y, b5 x
% |/ U& m: ^- O& o* F
else {// 本象限中没有残缺方格2 C) R! `- M% g; Z8 q5 a2 k" y O3 s9 s0 O
& ~4 C9 c- B( Y6 g2 A5 ]7 P0 G
// 把三格板t 放在右下角 # x( @: f7 W" e+ @- l7 j# y- h" v+ }- z$ X& f/ N1 f- B
Board[tr + s - 1][tc + s - 1] = t; F0 ~0 f9 E5 W2 B
/ c. ~' s- Y: z& V0 R" s; |
// 覆盖其余部分 C( J8 M4 M" Z5 }
* \! I. M. J/ a: y
Ti l e B o a r d ( t r, tc, tr+s-1, tc+s-1, s);} . s) ^; b& N: Z# t& A) ^ 1 V3 u9 q* I0 D, k3 i# L/ /覆盖右上象限 # A+ S Z: d! ~2 J3 P) P9 G5 s 7 y' R& D8 @+ a% L) aif (dr < tr + s && dc >= tc + s) ; B( c- e6 B5 e: F9 r& j, Z: j0 T' X9 z# f% d# E3 Y3 {% w3 ^8 l3 f, t
// 残缺方格位于本象限 $ x- i! _& F5 I+ C7 K( G3 i2 Y2 p% ]7 d5 I3 i7 J: u3 ]
Ti l e B o a r d ( t r, tc+s, dr, dc, s); X& O2 l+ G! ?- I3 Q
l% A. x6 c% relse {// 本象限中没有残缺方格8 G# {! i6 N. e- ~8 A2 t: k
$ h" c. j8 q+ [) V0 f. d
// 把三格板t 放在左下角 . \ @) K6 u7 V% f; c& | " p9 e" |8 i6 bBoard[tr + s - 1][tc + s] = t; J2 h' d) ^2 Z% y! e& {+ D0 D6 @$ c, X8 y" @. b
// 覆盖其余部分, N3 ^3 ~' f3 O
" l/ u$ q( d x9 m! @/ v
Ti l e B o a r d ( t r, tc+s, tr+s-1, tc+s, s);}5 @5 c# F; s* S. p
3 O3 l/ x! p, z+ q0 T9 L( q
/ /覆盖左下象限% v- h. t7 w4 m/ [& h
) i8 @8 ~5 B7 e4 R0 p* F
if (dr >= tr + s && dc < tc + s)( U1 f" w! y' a% {0 J" W4 j8 n+ r
% ^$ L1 f5 p' q: P" x2 P# [3 f
// 残缺方格位于本象限 a: ?+ c# }( |/ r