棋盘覆盖问题(C语言描述)
#include <stdio.h>
int board[100][100] = {0};
int tile = 0;
/**
* tr: 棋盘左上角方格的行号 tc: 棋盘左上角方格的列号
* dr: 特殊方格所所在的行号 dc: 特殊方格所在的列号
* size: size=2的k次方
*/
void chessBoard(int tr, int tc, int dr, int dc, int size)
{
if (size == 1) {
return;
}
int t = tile++; // 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] = t; // 用t号L型骨牌覆盖右下角
chessBoard(tr, tc, tc+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-1] = t; // 用t号L型骨牌覆盖左下角
chessBoard(tr, tc+s, tr+s-1, tc+s, s); // 覆盖其余方格
}
if (dr >= tr+s && dr < tc+s) { // 覆盖左下角子棋盘
chessBoard(tr+s, tc, dr, dc, s); // 特殊方格在此棋盘
} else { // 用t号L型骨牌覆盖右上角
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 { // 用t号L型骨牌覆盖左上角
board[tr+s][tc+s] = t;
chessBoard(tr+s, tc+s, tr+s, tc+s, s); // 覆盖其余方格
}
}