- board=zeros(100,100);
) D3 X6 {! I9 e5 U6 A2 u8 _ - n=4;: ?% A) V! B6 p/ Q
- size=2^n;
* [# `\" l. t, D - amount=0;1 D- u\" s# Y1 |\" _7 [
- [board,amount]=cover(1,1,2,5,board,size,amount);* ~! V3 Q' A% Q' O0 ]) F, A
- board(1:size,1:size)6 h; j) F- G& x6 j* m: M$ |
- 7 b\" k9 J' z2 `! n& J, E7 Z
复制代码- function [board,amount]=cover(i,j,k,l,board,size,amount)%(i,j)为左上角 (k,l)残缺 size为规模 amount为片数3 i% w6 ]/ ]\" |- A; D) ?4 s
5 M+ H6 r+ F# b5 N+ J+ ~7 t- if size==1* b, n, h2 G' v0 @# ?$ ~% P8 [- F
- return- T4 J% j# W1 D: K+ q
- end
5 e0 }9 w, X+ a& Z% w - amount=amount+1;
& @$ E3 n$ r! W% V; E - size=size/2;
- g+ [, {. N/ Q L2 c - if (k<size+i)&(l<size+j)%残缺位于左上棋盘
) m: _1 N+ Y# `- l+ W
4 B, |6 F$ t/ R- S' j- board(size+i-1,size+j)=amount;board(size+i,size+j)=amount;board(size+i,size+j-1)=amount;%放置
: ?, y2 |0 s2 M - [board,amount]=cover(i,j,k,l,board,size,amount);[board,amount]=cover(i,j+size,size+i-1,j+size,board,size,amount);
! ]/ M- }& V6 ?3 M' D$ } - [board,amount]=cover(size+i,size+j,size+i,size+j,board,size,amount);[board,amount]=cover(i+size,j,i+size,j+size-1,board,size,amount);
+ \% z5 K4 g1 Q) \8 ~ - elseif (k>=size+i)&(l<size+j)%残缺位于左下棋盘( j/ E5 L5 \& }/ ]# d* @
- board(size+i-1,size+j)=amount;board(size+i,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置
# |$ |/ y- [: J! X( C7 d6 ? - [board,amount]=cover(i+size,j,k,l,board,size,amount);[board,amount]=cover(i,j+size,size+i-1,j+size,board,size,amount);
2 a\" |( ^% _4 \' O - [board,amount]=cover(size+i,size+j,size+i,size+j,board,size,amount);[board,amount]=cover(i,j,i+size-1,j+size-1,board,size,amount);7 `3 y, h/ y; `; j
- elseif (k<size+i)&(l>=size+j)%残缺位于右上棋盘
+ Y/ M/ w\" ~( H - board(size+i,size+j-1)=amount;board(size+i,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置
5 ]2 E% D\" i: n) M; H7 P& F - [board,amount]=cover(i,j+size,k,l,board,size,amount);[board,amount]=cover(i,j,i+size-1,j+size-1,board,size,amount);8 H$ `! ^4 U e+ g
- [board,amount]=cover(size+i,size+j,size+i,size+j,board,size,amount);[board,amount]=cover(i+size,j,i+size,j+size-1,board,size,amount);
% w% ^6 ]1 F0 O$ V, m: t: V - elseif (k>=size+i)&(l>=size+j)%残缺位于右下棋盘: G1 a! m) `8 A+ n
- board(size+i,size+j-1)=amount;board(size+i-1,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置8 v. o9 g. I2 E+ @- _ ^, C c
- [board,amount]=cover(size+i,size+j,k,l,board,size,amount);[board,amount]=cover(i,j+size,size+i-1,j+size,board,size,amount);+ `7 U E* D( e2 w) _0 |
- [board,amount]=cover(i,j,i+size-1,j+size-1,board,size,amount);[board,amount]=cover(i+size,j,i+size,j+size-1,board,size,amount);
s- ?1 E- ?5 I2 n6 z - end
) }' I( G7 ~% Z& A* q. a5 E
/ S0 r' J3 s _7 C- end
复制代码这段代码实现了一个递归算法,用于在一个二维棋盘上填充缺失的部分,其中棋盘大小为100x100。下面是对代码的详细解释:1.初始化:2.board 是一个100x100的矩阵,初始化为全零。这个矩阵表示棋盘,其中的元素将被填充。3.n 表示棋盘的2的幂次方边长,这里设置为4,所以 size = 2^n 就是棋盘的边长。4.amount 用于计数已经填充的片数,初始化为0。5.调用 cover 函数:6.cover 函数是一个递归函数,用于填充缺失的部分。它接受左上角坐标 (i, j) 和残缺区域的左上角坐标 (k, l),以及当前棋盘的大小 size 和已填充的片数 amount。7.函数首先检查 size 是否为1,如果是,表示当前棋盘已经缩小到最小规模,不再分割,直接返回。8.递归填充:9.然后,函数增加 amount,表示填充了一个片。10.接下来,根据缺失区域的位置,分别在左上、左下、右上、右下四个棋盘中的合适位置填充片,然后递归调用 cover 函数。11.递归终止条件:12.递归的终止条件是 size 变为1,此时直接返回。13.输出结果:14.最后,输出已经填充的棋盘的左上角大小为 size 的部分。这段代码实现了一个分治算法,通过递归地在每个棋盘区域填充缺失的部分,最终完成整个棋盘的填充。在递归的过程中,通过调整参数来实现在不同的子棋盘中填充片。函数的输出是填充完成后的部分棋盘。
. w; ]2 |" G& t( |
: t+ J& x/ c) k! l$ m |