四种情况的骨牌
基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。
4个块中有一个块包含一个特殊方格,其他 3 个没有特殊方格,它们 3 个组成了一个L型骨牌。
覆盖的过程是从棋盘的中间向两边扩散:
如果左上角的块内没有特殊方格,则在左上角的块的右下角覆盖一个特殊方格。
如果右上角的块内没有特殊方格,则在右上角的块的左下角覆盖一个特殊方格。
如果左下角的块内没有特殊方格,则在左下角的块的右上角覆盖一个特殊方格。
如果右下角的块内没有特殊方格,则在右下角的块的左上角覆盖一个特殊方格。
实现
#include
#include
#define N 8
using namespace std;
static int number = 1;
static int board[N][N] = { 0 };
void ChessBoard(int tr, int tc, int dr, int dc, int size);
int main()
{
int dr, dc,i,j;
cout << "请输入初始特殊方格的位置x和y:";
cin >> dr>>dc;
ChessBoard(0,0,dr,dc,N);
for (i = 0; i < N; i++)
{
for (j = 0;j= 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);
}
}