1. 棋盘覆盖问题
在一个 2 k 2^{k} 2k× 2 k 2^{k} 2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1025;
int a[N][N];
int num=1;
void CB(int x,int y,int dx,int dy,int size1)
{
if(size1==1)
return ;
int t=++num; // L 型骨牌的标号;
int s=size1/2;
if(dx<x+s&&dy<y+s) // 左上
{
CB(x,y,dx,dy,s);
}
else
{
int nx=x+s-1;
int ny=y+s-1;
a[nx][ny]=t;
CB(x,y,nx,ny,s);
}
if(dx<x+s&&dy>=y+s) // 右上
{
CB(x,y+s,dx,dy,s);
}
else
{
int nx=x+s-1;
int ny=y+s;
a[nx][ny]=t;
CB(x,y+s,nx,ny,s);
}
if(dx>=x+s&&dy<y+s) // 左下
{
CB(x+s,y,dx,dy,s);
}
else
{
int nx=x+s;