问题描述
在一个2k×2k
个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为特殊方格
,且称该棋盘为特殊棋盘
。
在棋盘覆盖问题中,要用图示的4种
不同形态的L型
骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
解决方案
#include <stdio.h>
int title = 1;
int Board[9][9];
void BoardCover(int br,int bl,int dr,int dl,int size){//br棋盘起始的行号,bl棋盘起始的列号,dr特殊方格行号,dl特殊方块开始的列号,size棋盘大小
if(size==1)return; //当棋盘只剩一个方块,结束递归
int s = size/2; //分割棋盘
int t = title++; //定义骨牌
if(dr<br+s && dl<bl+s){ //当特殊方格在左上时
BoardCover(br,bl,dr,dl,s);
}else{
Board[br+s-1][bl+s-1] = t; //特殊方格不在左上时,贴上骨牌
BoardCover(br,bl,br+s-1,bl+s-1,s); //骨牌位置作为新的特殊方块,继续递归
}
if(dr<br+s&&dl>=bl+s){ //当特殊方格在右上时
BoardCover(br,bl+s,dr,dl,s);
}else{
Board[br+s-1][bl+s] = t; //特殊方格不在右上时,贴上骨牌
BoardCover(br,bl+s,br+s-1,bl+s,s);
}
if(dr>=br+s&&dl<bl+s){ //当特殊方格在左下时
BoardCover(br+s,bl,dr,dl,s);
}else{
Board[br+s][bl+s-1] = t; //特殊方格不在左下时,贴上骨牌
BoardCover(br+s,bl,br+s,bl+s-1,s);
}
if(dr>=br+s&&dl>=bl+s){ //当特殊方格在右下时
BoardCover(br+s,bl+s,dr,dl,s);
}else{
Board[br+s][bl+s] = t; //特殊方格不在右下时,贴上骨牌
BoardCover(br+s,bl+s,br+s,bl+s,s);
}
}
int main(){
BoardCover(1,1,1,1,8);
for(int i = 1;i<9;i++){
for(int j = 1;j<9;j++){
printf("%d ",Board[i][j]);
}
printf("\n");
}
return 0;
}