话说有一天,linyorson 在“我的世界”中开了一个 n×n 的方阵。现在他有 m 个火把和 k 个萤石,分别放在 (x 1,y 1)∼(x m,y m) 和 (o 1,p 1)∼(o k​,p k) 的位置。已知没有光并且没放东西的地方会生成怪物,请问在这个方阵中有几个点会生成怪物?

注意,在本题中火把与萤石的照明范围与原版 Minecraft(我的世界)不尽相同,请以本题中的描述为准。

火把的照亮范围是:

暗 暗 光 暗 暗
暗 光 光 光 暗
光 光 火把 光 光
暗 光 光 光 暗
暗 暗 光 暗 暗
萤石是:

光 光 光 光 光
光 光 光 光 光
光 光 萤石 光 光
光 光 光 光 光
光 光 光 光 光
输入格式
输入共 m+k+1 行。

第一行为两个正整数 n,m 和一个非负整数 k。
第二到第 m+1 行每行两个正整数 x i,y i,表示各个火把的位置。
第 m+2 到第 m+k+1 行每行两个正整数 o i,p i,表示各个萤石的位置。

数据中可能没有萤石,但一定有火把。

输出格式
有几个点会生出怪物。

输入输出样例
输入 #1复制

5 1 0
3 3
输出 #1复制

12
说明/提示
数据保证 1≤n≤100,1≤m+k≤25,1≤m≤25,0≤k≤5。

#include<bits/stdc++.h>
using namespace std;
int m,k,x,y,o,p,n,cnt;
bool a[101][101];
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		for(int j=-2;j<=2;j++){
			for(int kk=-2;kk<=2;kk++)
			{
				if(abs(j)+abs(kk)>2) continue;
				if(x+j<1) continue; 
				if(x+j>n) continue;
				if(y+kk<1) continue;
				if(y+kk>n) continue;
				a[x+j][y+kk]=true;
			}
		}
	}
	for(int i=1;i<=k;i++)
	{
		cin>>x>>y;
		for(int j=-2;j<=2;j++){
			for(int kk=-2;kk<=2;kk++)
			{
				if(x+j<1) continue; 
				if(x+j>n) continue;
				if(y+kk<1) continue;
				if(y+kk>n) continue;
				a[x+j][y+kk]=true;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]==false)
			{
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

思路
这题很简单,只需模拟即可,最后统计有多少个点是未被照亮的。
输入的是x和y,照亮范围是x-2和y-2,当x=0,y=0时,很容易访问到map-2-2,显然越界访问一份不得。
所以我们需要用偏移量,每次访问时都额外 +2,防止越界,输出时下标从 3 开始。