【数据结构与算法】标记单元格问题

标记单元格问题

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值