标记单元格问题
n为任意偶数,在一张无限大的绘图格子纸上标记n个单元格,使得每个被标记的单元格有奇数个相邻的标记单元格。相邻是指两个单元格在水平方向或垂直方向上相邻,但非对角方向上相邻。被标记的单元格必须形成连续域,也就是说区域中任意一对标记单元格之间有一条经过一系列相邻标记单元格的路径。
分析上述问题可知:利用减治的思想,以2个单元格水平相邻放置开始,每次加上2个单元格,直至单元格数目等于n为止。在这个过程中,可以发现如果每次在上一次结果的最后一个单元格的水平方向和竖直方向都添加一个单元格,而且在水平方向上添加的单元格方向与上一次在水平方向上添加的单元格方向相反(上一次如果在最后一个单元格的上方添加,则这一次就在最后一个单元格的下方添加),即可满足要求,具体如下图所示:
上述过程中,奇数次添加单元格时,水平方向上的添加也可以变为在单元格的下方,只需要满足每次水平方向上的添加是上下交替进行的即可,而这整个过程也可以在竖直方向上进行,这时只需要将上面这张过程图竖直放置,即可观察到竖直方向的设计过程。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cout << "请输入一个偶数:";
cin >> n;
while(n <=1 || n%2 == 1){
cout << "输入有误!" << endl;
cout << "请输入一个偶数:";
cin >> n;
}
int height = 3;
int width = n/2 + 1;
vector<vector<int>> grid(height, vector<int>(width, 0));
grid[1][0] = 1;
grid[1][1] = 1;
for(int i=1; i<=(n-2)/2; i++){
if(i % 2 == 1){
grid[0][i] = 1;
}else{
grid[2][i] = 1;
}
grid[1][i+1] = 1;
}
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
cout << grid[i][j] << " ";
}
cout << endl;
}
return 0;
}