话说有一天,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 开始。