题目描述
话说有一天 linyorson 在“我的世界”开了一个 �×�n×n 的方阵,现在他有 �m 个火把和 �k 个萤石,分别放在 (�1,�1)∼(��,��)(x1,y1)∼(xm,ym) 和 (�1,�1)∼(��,��)(o1,p1)∼(ok,pk) 的位置,没有光并且没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?
P.S. 火把的照亮范围是:
|暗|暗| 光 |暗|暗|
|暗|光| 光 |光|暗|
|光|光|火把|光|光|
|暗|光| 光 |光|暗|
|暗|暗| 光 |暗|暗|
萤石:
|光|光| 光 |光|光|
|光|光| 光 |光|光|
|光|光|萤石|光|光|
|光|光| 光 |光|光|
|光|光| 光 |光|光|
输入格式
输入共 �+�+1m+k+1 行。
第一行为 �,�,�n,m,k。
第 22 到第 �+1m+1 行分别是火把的位置 ��,��xi,yi。
第 �+2m+2 到第 �+�+1m+k+1 行分别是萤石的位置 ��,��oi,pi。
注:可能没有萤石,但一定有火把。
输出格式
有几个点会生出怪物。
输入输出样例
输入 #1复制
5 1 0 3 3
输出 #1复制
12
说明/提示
数据保证,1≤�≤1001≤n≤100,1≤�+�≤251≤m+k≤25,1≤�≤251≤m≤25,0≤�≤50≤k≤5。
i-2 | i-1 | i | i+1 | i+2 | |
---|---|---|---|---|---|
j-2 | y | ||||
j-1 | y | y | y | ||
j | y | y | y | y | |
j+1 | y | y | y | ||
j+2 | y |
【题目大意】
给你一块n * n的地和萤石、火把若干
萤石可以照亮以自身为中心5 * 5的矩阵
火把可以照亮上下左右各两格。
四个方向对角线上各一格
求没法被照亮的方块块数
【题目分析】
读入数据
因为只有萤石和火把这两种可能
所以用if判断一下放置的是什么就好了
然后如果是火把
那就将他的上下左右的两个和对角线四个方向上各一格都标为亮了
如果是萤石
那就将以他为中心的5 * 5的矩阵上面每一个方块都标为亮的
标记的话可以用for循环来标记
也可以直接if标记
【注意】
放置了火把和萤石的方块是亮的
不会生成怪物。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,k,x,y,sum=0;
cin>>m>>n>>k;
int a[m+5][m+5]={};
for(int i=0;i<n;i++){
cin>>x>>y;
x--,y--;
a[x][y]=1,a[x-1][y]=1,a[x-2][y]=1,a[x+1][y]=1,a[x+2][y]=1;
a[x][y+1]=1,a[x][y+2]=1,a[x][y-1]=1,a[x][y-2]=1;
a[x-1][y-1]=1,a[x+1][y+1]=1,a[x-1][y+1]=1,a[x+1][y-1]=1;
}
for(int i=0;i<k;i++){
cin>>x>>y;
x-=3,y-=3;
for(int j=x;j<x+5;j++)
for(int k=y;k<y+5;k++)a[j][k]=1;
}
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)if(!a[i][j])sum++;
cout<<sum;
}