-->
当前位置:首页 > 题库 > 正文内容

程序填空题:求解棋盘覆盖问题1(分治法)

Luz4年前 (2021-05-10)题库828
用分治法求解棋盘覆盖问题。有一个$$2^{k}$$×$$2^{k}$$(k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格。现在要用如下的L型骨牌覆盖除了特殊方格外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重叠。请给出一种覆盖方法。

![图片1.png](~/19e0d77a-790c-4e72-8c89-7412a4b3d11b.png)


```c++
#include
#include
#include
#define MAX 1025
using namespace std;
int board[MAX][MAX];
int tile=1;

void ChessBoard(int tr,int tc,int dr,int dc,int size)
{ if(size==1) return;
int t=tile++;
int s=size/2;
if(dr ChessBoard();
else
{ board[tr+s-1][tc+s-1]=t;
ChessBoard();
}

if(dr=tc+s)
ChessBoard();
else
{ board[tr+s-1][tc+s]=t;
ChessBoard();
}

if(dr>=tr+s && dc ChessBoard();
else
{ board[tr+s][tc+s-1]=t;
ChessBoard();
}

if(dr>=tr+s && dc>=tc+s)
ChessBoard();
else
{ board[tr+s][tc+s]=t;
ChessBoard();
}
}

int main()
{
int dr,dc,size;
int j,i;
cin>>size;
cin>>dr>>dc;
ChessBoard();
for(i=0;i cout< for(j=0;j {
cout< }
cout<}
return 0;
}
```
### 输入样例:
第一行输入一个数n表示棋盘大小,第二行输入特殊方格的行列下标。
```in
8
1 2
```

### 输出样例:
输出棋盘。
```out
3 3 4 4 8 8 9 9
3 2 0 4 8 7 7 9
5 2 2 6 10 10 7 11
5 5 6 6 1 10 11 11
13 13 14 1 1 18 19 19
13 12 14 14 18 18 17 19
15 12 12 16 20 17 17 21
15 15 16 16 20 20 21 21
```





答案:
第1空:tr,tc,dr,dc,s

第2空:tr,tc,tr+s-1,tc+s-1,s

第3空:tr,tc+s,dr,dc,s

第4空:tr,tc+s,tr+s-1,tc+s,s

第5空:tr+s,tc,dr,dc,s

第6空:tr+s,tc,tr+s,tc+s-1,s

第7空:tr+s,tc+s,dr,dc,s

第8空:tr+s,tc+s,tr+s,tc+s,s

第9空:0,0,dr,dc,size

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。