问题描述:
在一个2^k * 2^k*(k>=0)
个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为特殊方格。棋盘覆盖问题要求用图4.10(b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何两个L型骨牌不得重复覆盖。
算法:
代码实现:
#include<bits/stdc++.h>
using namespace std;
int t=0;
int board[205][205];
void ChessBoard(int tr,int tc,int dr,int dc,int size){
if(size==1) return;
int t1=++t; //t1表示本次覆盖所用L型骨牌的编号
int s=size/2; //划分棋盘
//特殊方格在左上角子棋盘中
if(dr<tr+s&&dc<tc+s){
ChessBoard(tr,tc,dr,dc,s);
}else{
board[tr+s-1][tc+s-1]=t1;
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{
board[tr+s-1][tc+s]=t1;
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{
board[tr+s][tc+s-1]=t1;
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{
board[tr+s][tc+s]=t1;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main(){
int k,dr,tr;
cin>>k>>dr>>tr;
int size=pow(2,k);
ChessBoard(0,0,dr,tr,size);
for(int i=0;i<size;++i){
for(int j=0;j<size;++j){
cout<<board[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
运行截图:
参考
算法分析与设计P65 4.3.2 棋盘覆盖问题