第 43 题 (棋盘覆盖问题)在一个$2^k \times 2^k $个方格组成的棋盘中恰有一个方格与其他方格不同(如图
中标记为-1的方格),称之为特殊方格。现用L形(占3个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是$(4^k-1)/3$。在下面给
出的覆盖方案例子中,k=2,相同的3个数字构成一个纸片。下面给出的程序使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角 、左下角、右下角,递归进行。
请将程序补充完整。
例:
-1为特殊方格的位置,其他数字表示L形方格放置的顺序
#include<bits/stdc++.h>
using namespace std ;
int board[65][65],tile;//tile 为纸片编号
void chessboard(int tr, int tc,int dr,int dc,int size)
{ /* dr,dc依次为特殊方格的行、列号 */
int t, s;
if(size==1)
return ;
tile++;
s= size/2;
if(___(1)___)
chessboard(tr,tc,dr,dc,s);
else{
bourd[tr+s-1][tc+s-1]=t;
___(2)___;
}
if(dr<tr+s&&dc<tc+s)
chessboard(tr,tc+s,dr,dc,s);
else{
bourd[tr+s-1][tc+s]=t;
___(3)___;
}
if(dr>=tr+s&&dc<tc+s)
chessboard(tr + s, te, dr, dc,s);
else{
board[tr+s][te+s-1]= t;
___(4)___;
}
if(dr>= tr+ s&& dc>= tc+s)
chessboard( tr + s, tc + s, dr, dc, s );
else{ board[tr+ s][tc+s]= t;
___(5)___; }
}
void prtl(int b[][65],int n)
{
int i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
cout<< setw(3)<< b[i][j];
cout << endl;
}
}
int main(){
int size, dr, dc;
cout << "input size(4/8/16/64):"<<endl;
cin>> size;
cout<< "input the position of special block(x,y):"<< endl;
cin>> dr>> dc;
board[dr][dc]=-1;
tile++;
chesbord(1,1,dr,dc, size);
prl(board, size);
}
第 43 题 ①处应填( )
第 44 题 ②处应填( )
第 45 题 ③处应填( )
第 46 题 ④处应填( )
第 47 题 ⑤处应填( )