设一个n*n棋盘,n=2^k,用L 型条块覆盖棋盘中除一个指定方格外的所有方格,每个L型条块可恰好覆盖3 个方格。
例:假设n=8,指定左上角不能被覆盖,棋盘的一种覆盖方式如下。
#include <stdio.h> int a[100][100]; int index=1; //辨别L型的标记 void chessboard(int tx,int ty,int dx,int dy,int s) { int t; if(s==1) return ; t=index++; s=s/2; if(dx<tx+s && dy<ty+s) //左上格 chessboard(tx,ty,dx,dy,s); else { a[ty+s-1][tx+s-1]=t; chessboard(tx,ty,tx+s-1,ty+s-1,s); } if(dx>tx+s-1 && dy<ty+s) //右上格 chessboard(tx+s,ty,dx,dy,s); else { a[ty+s-1][tx+s]=t; chessboard(tx+s,ty,tx+s,ty+s-1,s); } if(dx<tx+s && dy>ty+s-1) //左下格 chessboard(tx,ty+s,dx,dy,s); else { a[ty+s][tx+s-1]=t; chessboard(tx,ty+s,tx+s-1,ty+s-1,s); } if(dx>tx+s-1 && dy>ty+s-1) //右下格 chessboard(tx+s,ty+s,dx,dy,s); else { a[ty+s][tx+s]=t; chessboard(tx+s,ty+s,tx+s,ty+s,s); } } int main() { int n; int dx,dy; int i,j; printf("请输入棋盘大小(N*N,且N为偶数):"); scanf("%d",&n); printf("请输入特殊点坐标:"); scanf("%d%d",&dx,&dy); a[dy-1][dx-1]=0; chessboard(0,0,dx-1,dy-1,n); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d\t",a[i][j]); putchar('\n'); } return 0; }