【CCPC】2022绵阳站 H. Life is Hard and Undecidable, but... | 构造

172 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

题目链接

codeforces.com/gym/104065/…

题目

原题目太长了并且有很多不重要的东西,我节选了一部分比较关键的内容粘贴在下面。

image.png image.png

题目大意

在一个区域里有若干个细胞,细胞只会出现在整点上,细胞和周围的细胞八连通。最初 t=0t=0 时全场有若干个细胞,有以下规则:

  • 如果时刻 tt 一个细胞周围的细胞数量不超过 1,在 t+1t+1 时刻它将会因为孤独而死。
  • 如果时刻 tt 一个细胞周围的细胞数量不小于 4,在 t+1t+1 时刻它将会因为拥挤而死。
  • 如果时刻 tt 一个空点周围的细胞数量恰等于 3,在 t+1t+1 时刻该点将会产生一个新细胞。
  • 如果时刻 tt 一个细胞周围的细胞数量是 2 或者 3,在 t+1t+1 时刻它将会保持存活。

要求构造一个初始状态,使得时刻 k1k-1 存在细胞存活,时刻 kk 不存在细胞存活。构造的所有细胞的坐标在 1 到 300 之间。

思路

如果我们的构造中出现新生的细胞,我们的问题规模就会急剧扩大,难以解决,所以我们应该避免出现一个空地与恰好三个细胞相邻的情况。

按照上述思路,容易发现我们只需要构造一系列斜着排列的点,即可满足要求:

  • 每一时刻两端的点只与 1 个点相邻,会因为孤独而消失。
  • 每一时刻除了两端之外的其他节点与 2 个点相邻,将会保持存活。
  • 没有空地与恰好三个点相邻,不会产生新的细胞。

所以只需要从 1 循环到 2×k2\times k 输出 (i,i)(i,i) 即可。

代码

#include <bits/stdc++.h>
using namespace std;

int n;

int main()
{
	scanf("%d",&n);
	printf("%d\n",2*n);
	for(int i=1;i<=2*n;i++)
	{
		printf("%d %d\n",i,i);
	}
        return 0;
}