- board=zeros(100,100);6 o; e% }) s8 ]# B4 Z
- n=4;; E% j/ A6 R6 U0 p. M: z
- size=2^n;
3 I% P# q2 ?- R3 v - amount=0;
. ]* {, @) E( l\" d, ~& w' I - [board,amount]=cover(1,1,2,5,board,size,amount);4 J\" o0 x, z+ T4 b: h
- board(1:size,1:size)
4 W% b5 P# D) S0 M% P - ; Z! r6 |, I; D
复制代码- function [board,amount]=cover(i,j,k,l,board,size,amount)%(i,j)为左上角 (k,l)残缺 size为规模 amount为片数 z0 p. X1 J) t$ Z
- 8 o9 n4 K4 H Z' ^5 x& I* C
- if size==1
% q8 R\" c6 Y& N' G\" j - return
6 S( V% @) W0 E& k - end
+ S\" V; l2 C8 p5 [8 m, I- ^ - amount=amount+1;
: Y `$ J/ x9 O - size=size/2;5 V- q! @, ~- ?$ k) I
- if (k<size+i)&(l<size+j)%残缺位于左上棋盘6 w9 I! m/ Q u8 G# [
; P\" d) M; f3 a& Y\" S* h& W8 `- board(size+i-1,size+j)=amount;board(size+i,size+j)=amount;board(size+i,size+j-1)=amount;%放置9 \6 K3 N: k( {$ l5 @( c; R
- [board,amount]=cover(i,j,k,l,board,size,amount);[board,amount]=cover(i,j+size,size+i-1,j+size,board,size,amount);
( i0 G( V5 H+ L$ x% i - [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);6 R. }, M6 L; H! z\" J: ~7 L @/ F
- elseif (k>=size+i)&(l<size+j)%残缺位于左下棋盘
' i( ?* o* r) ?; x- j - board(size+i-1,size+j)=amount;board(size+i,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置
3 A$ v# w8 `4 T7 w; r - [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);
* T! O6 [8 ?/ f4 U 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);
6 S$ y; g5 u\" h! f- X! s! D - elseif (k<size+i)&(l>=size+j)%残缺位于右上棋盘
+ O' p3 J/ @: O - board(size+i,size+j-1)=amount;board(size+i,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置
' a# r\" }# @, _0 n0 n3 ]2 f: d - [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);
2 k* P$ C8 [+ _& B% V - [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);
7 a: C, B3 V\" q* }8 P1 L& T b! D - elseif (k>=size+i)&(l>=size+j)%残缺位于右下棋盘
7 J' d1 v9 l$ }5 y1 ~! a/ b - board(size+i,size+j-1)=amount;board(size+i-1,size+j)=amount;board(size+i-1,size+j-1)=amount;%放置1 M. Y& J- z: v( x
- [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);
9 z/ C9 x- }( a, j4 ^4 J1 t0 } - [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);
4 u0 P6 u t! a. m y# w% b/ X\" { - end+ P/ o, S, H' }\" f4 {/ i
- * L* `5 a/ y/ p5 ~9 b
- 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 的部分。这段代码实现了一个分治算法,通过递归地在每个棋盘区域填充缺失的部分,最终完成整个棋盘的填充。在递归的过程中,通过调整参数来实现在不同的子棋盘中填充片。函数的输出是填充完成后的部分棋盘。 6 a' X* k. M, t6 N* t2 ^9 w/ ^
4 x! b8 w0 O6 X Z3 g$ |" X
|