问题描述:
在一个2^k*2^k 的方格组成的棋盘中,有一个方格与其他方格不同,称为特殊方格。
现在邀请4中不同的L型骨牌 覆盖给定的棋盘除特殊方格外的所有方格。
例如:这是一个K=2时的棋盘,特殊点坐标为(0,1)。
四中L型骨牌如图:
程序代码:
#include <STDIO.H> #define KEY 8 //棋盘的阶数 int ar[KEY][KEY]={0}; //二维数组保存的棋盘,初始值为全0 int tile=1; //标志 void chessBoard(int tr,int tc,int dr,int dc,int size) { int s=size/2; //分割棋盘 int flag; if(size==1) return ; flag=++tile; // 如果特殊点在左上角 if(dr<tr+s && dc<tc+s) chessBoard(tr,tc,dr,dc,s); //在的话,递归 else { ar[tr+s-1][tc+s-1]=flag; //不在的话,把左上角棋盘的右下角赋为标志位。。。下面三个类似 chessBoard(tr,tc,tr+s-1,tc+s-1,s); } // 如果特殊点在右上角 if(dr<tr+s && dc>=tc+s) chessBoard(tr,tc+s,dr,dc,s); else { ar[tr+s-1][tc+s]=flag; chessBoard(tr,tc+s,tr+s-1,tc+s,s); } // 如果特殊点在左下角 if(dr>=tr+s && dc<tc+s) chessBoard(tr+s,tc,dr,dc,s); else { ar[tr+s][tc+s-1]=flag; chessBoard(tr+s,tc,tr+s,tc+s-1,s); } // 如果特殊点在右下角 if(dr>=tr+s && dc>=tc+s) chessBoard(tr+s,tc+s,dr,dc,s); else { ar[tr+s][tc+s]=flag; chessBoard(tr+s,tc+s,tr+s,tc+s,s); } } void init(int x,int y) //初始化一个点为特殊点 { ar[x][y]=1; } int main() { int i,j; i=4; j=5; init(i,j); chessBoard(0,0,i,j,8); for(i=0;i<8;i++) { for(j=0;j<8;j++) printf("%2d ",ar[i][j]); puts(""); } }
执行完结果。
时间: 2024-11-05 16:47:58