问题描述:
在一个2k×2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
易知,覆盖任意一个2k×2k的特殊棋盘,用到的骨牌数恰好为(4K-1)/3。
输入格式
第一行为k(棋盘的尺寸),第二行为x,y(1<=x,y<=2^k),分别表示特殊方格所在行与列。
输出格式
共2^k行,分别表示覆盖该格的L型的编号(特殊格用0表示)。
输出要求:最小字符宽度为4,左对齐输出
#include<stdio.h>
#include<math.h>
//#include <bits/stdc++.h>
//using namespace std;
const int N=500;
int board[N][N]={0};
int cnt=1;//记录骨牌序号
void ChessBoard(int tr,int tc,int dr,int dc,int size){
//tr,tc为棋盘最左上角的坐标
//dr,dc为特殊方格的坐标
//size为棋盘阶数(2^size)
if(size==1){
return;
//递归出口
}else{//进入递归 化为4个size-1阶的问题;
int t=cnt++;
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]=t;//构建的特殊方格的坐标
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]=t;//构建的特殊方格的坐标
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]=t;//构建的特殊方格的坐标
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]=t;//构建的特殊方格的坐标
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
}
int main(){
int k,x,y;
// printf("请输入棋盘的规模K:");
scanf("%d",&k);
// printf("请输入特殊方格的下标x,y:");
//注意:输入的是下标,下标从0开始
scanf("%d %d",&x,&y);
ChessBoard(0,0,x,y,pow(2,k));
// 棋盘最左上角坐标位(0,0)
for(int i=0; i<pow(2,k); i++){
for (int j=0; j<pow(2,k); j++){
if(j==pow(2,k)-1)
printf("%d",board[i][j]);
else
printf("%-4d",board[i][j]);
}
printf("\n");
}
return 0;
}