洛谷 P1789 【Mc生存】插火把 题解

P1789 【Mc生存】插火把

题目背景

初一党应该都知道......

题目描述

话说有一天 linyorson 在“我的世界”开了一个 \(n\times n(n\le 100)\) 的方阵,现在他有 \(m\) 个火把和 \(k\) 个萤石,分别放在 \((x_1,y_1)...(x_m,y_m)\)\((o_1,p_1)...(o_k,p_k)\) 的位置,没有光或没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?

P.S.火把的照亮范围是:

    |暗|暗| 光 |暗|暗|
    |暗|光| 光 |光|暗|
    |光|光|火把|光|光|
    |暗|光| 光 |光|暗|
    |暗|暗| 光 |暗|暗|

萤石:

    |光|光| 光 |光|光|
    |光|光| 光 |光|光|
    |光|光|萤石|光|光|
    |光|光| 光 |光|光|
    |光|光| 光 |光|光|

输入格式

输入共m+k+1行。

第一行为n,m,k。

第2到第m+1行分别是火把的位置xi yi。

第m+2到第m+k+1行分别是萤石的位置oi pi。

注:可能没有萤石,但一定有火把。

所有数据保证在int范围内。

输出格式

有几个点会生出怪物。

输入输出样例

输入 #1

5 1 0
3 3

输出 #1

12

【思路】

模拟
很暴力的模拟

【闲话】

如果这片题解过掉的话
那就是我通过的第100篇题解了
纪念一下,所以我还是选择MC生存系列的题来交我的第100篇题解
毕竟我从12年左右就开始玩MC了
很有感情

【题目大意】

给你一块nn的地和萤石、火把若干
萤石可以照亮以自身为中心5
5的矩阵
火把可以照亮上下左右各两格。
四个方向对角线上各一格
求没法被照亮的方块块数

【题目分析】

读入数据
因为只有萤石和火把这两种可能
所以用if判断一下放置的是什么就好了
然后如果是火把
那就将他的上下左右的两个和对角线四个方向上各一格都标为亮了
如果是萤石
那就将以他为中心的5*5的矩阵上面每一个方块都标为亮的
标记的话可以用for循环来标记
也可以直接if标记

【注意】

放置了火把和萤石的方块是亮的
不会生成怪物。

【完整代码】

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n,m,k;//n为边长,m为火把,k为萤石
	cin>>n>>m>>k;
	int owo,qwq;
	int awa,pwp;
	int a[n+5][n+5];
	memset(a,0,sizeof(a));
	for(int i=1;i<=m;++i)//火把循环,标为1代表火把 
	{	
		cin>>owo>>qwq;
		a[owo][qwq]=1;
	}
	for(int j=1;j<=k;++j)//萤石循环,标为2代表萤石 
	{
		cin>>awa>>pwp;
		a[awa][pwp]=2;
	}
	for(int l=1;l<=n;++l)
	{
		for(int u=1;u<=n;++u)
		{
			if(a[l][u]==1)
			{
				if(a[l-1][u]==0)a[l-1][u]=3;//3代表有光但不是火把也不是萤石
				if(a[l-2][u]==0)a[l-2][u]=3;
				if(a[l+1][u]==0)a[l+1][u]=3;
				if(a[l+2][u]==0)a[l+2][u]=3;
				if(a[l][u+1]==0)a[l][u+1]=3;
				if(a[l][u+2]==0)a[l][u+2]=3;
				if(a[l][u-2]==0)a[l][u-2]=3;
				if(a[l][u-1]==0)a[l][u-1]=3;
				if(a[l-1][u-1]==0)a[l-1][u-1]=3;
				if(a[l+1][u+1]==0)a[l+1][u+1]=3;
				if(a[l-1][u+1]==0)a[l-1][u+1]=3;
				if(a[l+1][u-1]==0)a[l+1][u-1]=3;
			}
			if(a[l][u]==2)
			{
				if(a[l-1][u]==0)a[l-1][u]=3;//3代表有光但不是火把也不是萤石
				if(a[l-1][u+1]==0)a[l-1][u+1]=3;
				if(a[l-1][u-1]==0)a[l-1][u-1]=3;
				if(a[l-1][u+2]==0)a[l-1][u+2]=3;
				if(a[l-1][u-2]==0)a[l-1][u-2]=3;
				if(a[l-2][u+2]==0)a[l-2][u+2]=3;
				if(a[l-2][u-2]==0)a[l-2][u-2]=3;
				if(a[l-2][u-1]==0)a[l-2][u-1]=3;
				if(a[l-2][u+1]==0)a[l-2][u+1]=3;
				if(a[l-2][u-1]==0)a[l-2][u-1]=3;
				if(a[l-2][u]==0)a[l-2][u]=3;
				if(a[l+1][u-2]==0)a[l+1][u-2]=3;
				if(a[l+1][u+2]==0)a[l+1][u+2]=3;
				if(a[l+1][u-1]==0)a[l+1][u-1]=3;
				if(a[l+1][u+1]==0)a[l+1][u+1]=3;
				if(a[l+1][u]==0)a[l+1][u]=3;
				if(a[l+2][u+1]==0)a[l+2][u+1]=3;
				if(a[l+2][u-1]==0)a[l+2][u-1]=3;
				if(a[l+2][u+2]==0)a[l+2][u+2]=3;
				if(a[l+2][u-2]==0)a[l+2][u-2]=3;
				if(a[l+2][u]==0)a[l+2][u]=3;
				if(a[l][u-1]==0)a[l][u-1]=3;
				if(a[l][u-2]==0)a[l][u-2]=3;
				if(a[l][l+2]==0)a[l][l+2]=3;
				if(a[l][u+1]==0)a[l][u+1]=3;
			}
		}
	}
	int js=0;
	for(int p=1;p<=n;++p)
	{
		for(int o=1;o<=n;++o)
		{
			if(a[p][o]==0)
			js++;
		}
	}
	cout<<js<<endl;
	return 0;
}

第100篇在洛谷上面通过的题解,
爱我MC
爱我OI

posted @ 2019-10-27 08:23  acioi  阅读(1204)  评论(0编辑  收藏  举报