c语言:二个残缺棋盘覆盖问题
时间: 2023-10-14 17:04:58 浏览: 128
C语言编写的棋盘覆盖问题
二个残缺棋盘覆盖问题是指,在一个大小为2^n * 2^n的棋盘上,有一个方块缺失,现在需要用L型骨牌(3个格子组成的L形)将棋盘覆盖,问最少需要多少个骨牌才能完全覆盖棋盘。
这个问题可以通过分治算法来解决,具体过程如下:
1. 将棋盘分成四个大小为2^(n-1) * 2^(n-1)的子棋盘。
2. 确定缺失方块所在的子棋盘,假设为左上角的子棋盘,将其分成三个L型骨牌覆盖。
3. 递归处理其他三个子棋盘,直到覆盖完整个棋盘。
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
int board[1025][1025];
int tile = 1;
void cover(int tr, int tc, int dr, int dc, int size, int missing_row, int missing_col)
{
if (size == 1) return;
int t = tile++;
int s = size / 2;
if (missing_row < tr + s && missing_col < tc + s) {
cover(tr, tc, tr + s - 1, tc + s - 1, s, missing_row, missing_col);
} else {
board[tr + s - 1][tc + s - 1] = t;
cover(tr, tc, tr + s - 1, tc + s - 1, s, tr + s - 1, tc + s - 1);
}
if (missing_row < tr + s && missing_col >= tc + s) {
cover(tr, tc + s, tr + s - 1, dc, s, missing_row, missing_col);
} else {
board[tr + s - 1][tc + s] = t;
cover(tr, tc + s, tr + s - 1, dc, s, tr + s - 1, tc + s);
}
if (missing_row >= tr + s && missing_col < tc + s) {
cover(tr + s, tc, dr, tc + s - 1, s, missing_row, missing_col);
} else {
board[tr + s][tc + s - 1] = t;
cover(tr + s, tc, dr, tc + s - 1, s, tr + s, tc + s - 1);
}
if (missing_row >= tr + s && missing_col >= tc + s) {
cover(tr + s, tc + s, dr, dc, s, missing_row, missing_col);
} else {
board[tr + s][tc + s] = t;
cover(tr + s, tc + s, dr, dc, s, tr + s, tc + s);
}
}
int main()
{
int n, missing_row, missing_col;
scanf("%d %d %d", &n, &missing_row, &missing_col);
int size = 1 << n;
board[missing_row][missing_col] = -1;
cover(0, 0, size-1, size-1, size, missing_row, missing_col);
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (board[i][j] == -1) {
printf(" ");
} else {
printf("%2d", board[i][j]);
}
}
printf("\n");
}
return 0;
}
```
在输入中,第一个数为棋盘大小的指数n,即棋盘大小为2^n * 2^n,第二个数和第三个数为缺失方块的行列坐标。
输出为覆盖后的棋盘,缺失方块用两个空格表示。
阅读全文