洛谷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;
}


相关文章
|
4天前
洛谷P1789 【Mc生存】插火把
洛谷P1789 【Mc生存】插火把
6 0
|
1月前
|
C++
【PTA】L1-019 谁先倒 (C++)
【PTA】L1-019 谁先倒 (C++)
41 0
【PTA】L1-019 谁先倒 (C++)
|
1月前
|
存储 算法
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
25 0
|
1月前
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
35 0
|
7月前
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
45 0
|
7月前
|
算法
算法:3瓶空瓶子可以换一瓶汽水
算法:3瓶空瓶子可以换一瓶汽水
Leecode 999. 车的可用捕获量
Leecode 999. 车的可用捕获量
39 0
|
测试技术
(dfs)(枚举)第十四届蓝桥杯第三次模拟赛:9.最大滑雪长度
(dfs)(枚举)第十四届蓝桥杯第三次模拟赛:9.最大滑雪长度
111 0
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
L2-032 彩虹瓶 (25 分)(栈)
L2-032 彩虹瓶 (25 分)(栈)
117 0
L2-032 彩虹瓶 (25 分)(栈)