在一个 2^k ×2^k 个方格组成的棋盘中恰有一个方格与其他方格不同(图中标记为-1 的 方格),称之为特殊方格。现用 L 型(占 3 个小格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是 (4^k-1) /3 。在下表给出的一个覆盖方案中, k=2,相同的 3 个数字构成一个纸片。
下面给出的程序是用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。
请将程序补充完整。
#include <iostream> #include <iomanip> 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) ____(1)_____; t=tile++; s=size/ 2; if(_____(2)_____) chessboard(tr,tc,dr,dc,s); else { board[tr+s-1][tc+s-1]=t; _____(3)_____; } if(dr<tr+s && dc>=tc+s) chessboard(tr,tc+s,dr,dc,s); else { board[tr+s-1][tc+s]=t; _____(4)______; } if(dr>=tr+s && dc<tc+s) chessboard(tr+s,tc,dr,dc,s); else { board[tr+s][tc+s-1]=t; _____(5)______; } if(dr>=tr+s && dc>=tc+s) chessboard(tr+s,tc+s,dr,dc,s); else { board[tr+s][tc+s]=t; ______(6)______; } } void prt1(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; cin>>size; cin>>dr>>dc; board[dr][dc]=-1; tile++; chessboard(1,1,dr,dc,size); prt1(board,size); }