蓝桥杯刷题——灌溉和扩散

272 阅读2分钟

「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」。

这是蓝桥杯21年和20年的题目,是一类题目,做法都是一样的,这里放在一起解答。

题目

灌溉

image.png

扩散

image.png

思路

可以看到,这就是一类题目,在一个点的上下左右四个方向进行扩散。那么我们如何去做呢?我们可以想到用暴力搜索算法,把所有可能的位子遍历一遍,看看是否会被扩散到。那么现在问题又来了。我们怎么判断随机的一个点是否可以被扩散到呢?现在举个例子,现在只有一个扩散点(1,1),扩散到(5,5)这个点需要多少分钟?很显然就是8分钟,这个是怎么算的?其实就是两个点的横坐标的绝对值加上纵坐标的绝对值,这里大家可以仔细想想是不是,这里就不多解释了。那么只要遍历所有的可能位子的点,就是一个大矩形中的所有点,判断这个点到扩散点间的横坐标距离和纵坐标距离,如果小于给定分钟数,那么就说明这个点是可以扩散到的。

灌溉代码

#include <bits/stdc++.h>
using namespace std;
int a[11][2];
int main()
{
  int n,m;
  cin>>n>>m;
  int t,k;
  cin>>t;
  for(int i=1;i<=t;i++){
    cin>>a[i][0]>>a[i][1];
  }
  cin>>k;
  int ans=0;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++)
    {
      for(int c=1;c<=t;c++){
        if((abs(i-a[c][0])+abs(j-a[c][1]))<=k){//判断输入的几个灌溉点
          ans++;
          break;
        }
      }
    }
  }
  cout<<ans;
  return 0;
}

扩散代码

#include<iostream>
using namespace std;
bool judge(int x,int y){
  if (abs(x - 0) + abs(y - 0) <= 2020 || abs(x - 2020) + abs(y - 11) <= 2020 
  ||abs(x - 11) + abs(y - 14) <= 2020 || abs(x - 2000) + abs(y - 2000) <= 2020)//共四个判断点
    return true;
  return false;
}
int main(){
    int ans = 0; 
    for (int x = 0 - 2020; x <= 2020 + 2020; x++){
        for (int y = 0 - 2020; y <= 2020 + 2020; y++){
            if(judge(x,y))
                ans++;
        }
    }
    cout << ans;
}