洛谷P1789-【Mc生存】插火把(暴力模拟)

简介: 洛谷P1789-【Mc生存】插火把(暴力模拟)

题目描述:


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


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

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

萤石:

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

输入:


输入共m+k+1行。


第一行为n,m,k。


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


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


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


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


输出:


有几个点会生出怪物。


样例输入:


5 1 0

3 3


样例输出:


12


解题思路:


这道题就是根据那两张图上,火把和萤石分别可以照亮的范围用坐标给表示出来,这里用一个二维数组去标记,如果被照亮就标记为1,所以暴力结束后,二维数组中剩下为0的那些值就是会出现怪物的地方。


程序代码:


#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,m,k,i,j,o,p,q,r,sum=0;
  int dis[101][101];
  cin>>n>>m>>k;
  memset(dis,0,sizeof(dis));
  for(i=1;i<=m;i++)
  {
    cin>>o>>p;
    dis[o][p]=1;
    dis[o+1][p]=1;
    dis[o+1][p+1]=1;
    dis[o][p+1]=1;
    dis[o-1][p+1]=1;
    dis[o-1][p]=1;
    dis[o-1][p-1]=1;
    dis[o][p-1]=1;
    dis[o+1][p-1]=1;
    dis[o+2][p]=1;
    dis[o][p+2]=1;
    dis[o-2][p]=1;
    dis[o][p-2]=1;
  }
  for(i=1;i<=k;i++)
  {
    cin>>q>>r;
    dis[q][r]=1;
    dis[q+1][r]=1;
    dis[q+1][r+1]=1;
    dis[q][r+1]=1;
    dis[q-1][r+1]=1;
    dis[q-1][r]=1;
    dis[q-1][r-1]=1;
    dis[q][r-1]=1;
    dis[q+1][r-1]=1;
    dis[q+2][r]=1;
    dis[q+2][r+1]=1;
    dis[q+2][r+2]=1;
    dis[q+1][r+2]=1;
    dis[q][r+2]=1;
    dis[q-1][r+2]=1;
    dis[q-2][r+2]=1;
    dis[q-2][r+1]=1;
    dis[q-2][r]=1;
    dis[q-2][r-1]=1;
    dis[q-2][r-2]=1;
    dis[q-1][r-2]=1;
    dis[q][r-2]=1;
    dis[q+1][r-2]=1;
    dis[q+2][r-2]=1;
    dis[q+2][r-1]=1;
  }
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      if(!dis[i][j])
        sum++;
  cout<<sum<<endl;
  return 0;
}#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,m,k,i,j,o,p,q,r,sum=0;
  int dis[101][101];
  cin>>n>>m>>k;
  memset(dis,0,sizeof(dis));
  for(i=1;i<=m;i++)
  {
    cin>>o>>p;
    dis[o][p]=1;
    dis[o+1][p]=1;
    dis[o+1][p+1]=1;
    dis[o][p+1]=1;
    dis[o-1][p+1]=1;
    dis[o-1][p]=1;
    dis[o-1][p-1]=1;
    dis[o][p-1]=1;
    dis[o+1][p-1]=1;
    dis[o+2][p]=1;
    dis[o][p+2]=1;
    dis[o-2][p]=1;
    dis[o][p-2]=1;
  }
  for(i=1;i<=k;i++)
  {
    cin>>q>>r;
    dis[q][r]=1;
    dis[q+1][r]=1;
    dis[q+1][r+1]=1;
    dis[q][r+1]=1;
    dis[q-1][r+1]=1;
    dis[q-1][r]=1;
    dis[q-1][r-1]=1;
    dis[q][r-1]=1;
    dis[q+1][r-1]=1;
    dis[q+2][r]=1;
    dis[q+2][r+1]=1;
    dis[q+2][r+2]=1;
    dis[q+1][r+2]=1;
    dis[q][r+2]=1;
    dis[q-1][r+2]=1;
    dis[q-2][r+2]=1;
    dis[q-2][r+1]=1;
    dis[q-2][r]=1;
    dis[q-2][r-1]=1;
    dis[q-2][r-2]=1;
    dis[q-1][r-2]=1;
    dis[q][r-2]=1;
    dis[q+1][r-2]=1;
    dis[q+2][r-2]=1;
    dis[q+2][r-1]=1;
  }
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      if(!dis[i][j])
        sum++;
  cout<<sum<<endl;
  return 0;
}


相关文章
|
7月前
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
52 0
|
7月前
【每日一题Day258】LC2532过桥的时间 | 模拟 优先队列
【每日一题Day258】LC2532过桥的时间 | 模拟 优先队列
44 0
|
7月前
【每日一题Day356】LC2678老人的数目 | 字符串
【每日一题Day356】LC2678老人的数目 | 字符串
49 0
|
6月前
洛谷P1789 【Mc生存】插火把
洛谷P1789 【Mc生存】插火把
33 0
|
7月前
|
存储
【每日一题Day173】LC1019链表中的下一个更大节点 |单调栈
【每日一题Day173】LC1019链表中的下一个更大节点 |单调栈
32 0
|
7月前
|
存储 算法
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
45 0
|
7月前
|
图计算
【每日一题Day274】LC42接雨水 | 单调栈
【每日一题Day274】LC42接雨水 | 单调栈
50 0
|
7月前
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
49 0
|
7月前
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
52 0
|
7月前
【每日一题Day308】LC57插入区间 | 模拟
【每日一题Day308】LC57插入区间 | 模拟
48 0