棋盘覆盖问题(分治)(C语言)

(棋盘覆盖问题)在一个2k × 2k 个方格组成的棋盘中恰有一个方格与其他方格不同(图中标记为
-1 的方格),称之为特殊方格。现用L 型(占3 个小格)纸片覆盖棋盘上除特殊方格的所有部分,各纸
片不得重叠,于是,用到的纸片数恰好是(4k −1) / 3 。在下表给出的一个覆盖方案中,k=2,相同的3
个数字构成一个纸片。

#include using namespace std; int board[65][65],tile; /* tile 为纸片编号*/ void chessboard(int tr,int tc,int dr,int dc,int size){ int t,s; if (size==1) return ; t=tile++; s=size/2; if(tr+s>dr&&dc=tc+s){ chessboard(tr,tc+s,dr,dc,s); } else{ board[tr+s-1][tc+s]=t; chessboard(tr,tc+s,tr+s-1,tc+s,s); } if(dr>=tr+s&&dc=tr+s&&dc>=tc+s){ chessboard(tr+s,tc+s,dr,dc,s); } else{ board[tr+s][tc+s]=t; chessboard(tr+s,tc+s,tr+s,tc+s,s) ; } } void prt1(int b[][65],int n){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%3d",b[i][j]); printf("/n"); } } int main(){ int size,dr,dc; printf("input size(4/8/16/64):/n"); scanf("%d",&size); printf("input the position of special block(x,y):/n"); scanf("%d%d",&dr,&dc); board[dr][dc]=-1; tile++; chessboard(1,1,dr,dc,size); prt1(board,size); system("pause"); }   

你可能感兴趣的:(经典算法)