问题描述
Description
在一个2k × 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的棋盘上除特殊方格以外的所有方格,L型骨牌不能旋转,且任何两个L型骨牌不得重叠覆盖。
棋盘和标记为红色的特殊方格 4种L型骨牌
Input
第一行是一个T,表示案例数。对于每一个案例,有三个数K,X,Y分别表示在一个2k × 2k的棋盘中,在第X行第Y列有一个特殊方格。1 ≤ K ≤ 8
1 ≤ X, Y ≤ 2k
Output
输出这个被骨牌覆盖的棋盘,分别用a,b,c,d表示四种骨牌(分别用以下四种字符图形表示),特殊方格用*号表示。
aa bb c d
a b cc dd
具体输出见sample Output
Sample Input
2
2 1 2
1 1 1
Sample Output
c*bb
ccdb
cddd
ccdd
*d
dd
问题分析
在以(1,1)为起点的n阶的方阵中,若特殊方块在左上角,
不难发现(n/2,n/2+1),(n/2+1,n/2),(n/2+1,n/2+1)三个格子将会是d组成的三角,
这样一来将方块十字分成四份,每个小方块就相当于都有一个已经覆盖的方块(特殊方块)
那就是递归的思想
代码实现
#include<iostream> using namespace std; char bian[1000][1000]; int x=1; void chessBord(int li,int lr,int sl,int sr,int siz ){///其中li方正的左上角的行,lr左上角的列,sl特殊块的行,sr特殊块的的列 if(siz==1) return ; bool t=false; int s=siz/2; if(sl>li+s&&sr>lr+s){///特殊方块在右下角 bian[li+s][lr+s]='a'; bian[li+s+1][lr+s]='a'; bian[li+s][lr+s+1]='a'; chessBord(li+s,lr+s,sl,sr,s); } else{///不在此象限 chessBord(li+s,lr+s,li+s+1,lr+s+1,s); } if(sl>li+s&&sr<=lr+s){///特殊方块在左下角 bian[li+s][lr+s]='b'; bian[li+s][lr+s+1]='b'; bian[li+s+1][lr+s+1]='b'; chessBord(li+s,lr,sl,sr,s); } else{ chessBord(li+s,lr,li+s+1,lr+s,s); } if(sl<=li+s&&sr>lr+s){///特殊方块在右上角 bian[li+s][lr+s]='c'; bian[li+s+1][lr+s]='c'; bian[li+s+1][lr+s+1]='c'; chessBord(li,lr+s,sl,sr,s); } else{ chessBord(li,lr+s,li+s,lr+s+1,s); } if(sl<=li+s&&sr<=lr+s){///特殊方块在左上角 bian[li+s][lr+s+1]='d'; bian[li+s+1][lr+s+1]='d'; bian[li+s+1][lr+s]='d'; chessBord(li,lr,sl,sr,s); } else{ chessBord(li,lr,li+s,lr+s,s); } } int power(int a,int b) { int ans = 1; while(b){ if(b&1){ ans*=a; } a*=a; b>>=1; } return ans; } int main() { int t; cin>>t; while(t--){ int k,x,y; cin>>k>>x>>y; int length=0; length = power(2,k); for(int i=1;i<=length;i++){ for(int j=1;j<=length;j++){ bian[i][j]='0'; } } chessBord(0,0,x,y,length); bian[x][y]='*'; for(int i=1;i<=length;i++){ for(int j=1;j<=length;j++){ cout<<bian[i][j]; } cout<<endl; } } return 0; }