蓝桥—灌溉(JAVA)

## 蓝桥—灌溉(JAVA)**
题目链接:每日打卡551
题目:小蓝负责花园的灌溉工作。

花园可以看成一个 nn 行 mm 列的方格图形。中间有一部分位置上安装有出水管。

小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。

每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。

给定花园水管的位置,请问 kk 分钟后,有多少个方格被灌溉好?

输入描述
输入的第一行包含两个整数 n, mn,m。

第二行包含一个整数 tt,表示出水管的数量。

接下来 tt 行描述出水管的位置,其中第 ii 行包含两个数 r, cr,c 表示第 rr 行第 cc 列有一个排水管。

接下来一行包含一个整数 kk。
输出描述
输出一个整数,表示答案。
题解:灌溉向四周扩散很简单,有点问题的是要记录每次更新后的状态,不能在原数组中直接更新,要重新创建一个数组记录,还有就是用一个二维的布尔数组标记是否访问,这个也要每次循环都要更新。
AC代码:

import java.io.*;
import java.util.Arrays;

public class Main {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static  PrintWriter out  = new PrintWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args)throws IOException {
        int n= in(),m=in();
        boolean[][] a = new boolean[n][m];
        int q = in();
        int res =0;
        for (int i = 0; i <q; i++) {
            int r = in()-1;
            int c = in() -1;
           if(!a[r][c]){
               a[r][c]=true;
               res++;
           }

        }
        int k =in();
       while(k-->0){
           boolean[][] ca = new boolean[n][m];
           for (int i = 0; i < n; i++) {
               ca[i]= Arrays.copyOf(a[i],a[i].length);
           }
           for (int i = 0; i < n; i++) {
               for (int j = 0; j < m; j++) {
                   if(a[i][j]){
                       if(i-1>=0) {
                           if(!a[i-1][j]){
                               ca[i-1][j]=true;
                               res++;
                           }
                       }
                       if(i+1<n){
                           if(!a[i+1][j]){
                               ca[i+1][j]=true;
                               res++;
                           }
                       }
                       if(j-1>=0){
                           if(!a[i][j-1]){
                               ca[i][j-1]=true;
                               res++;
                           }
                       }
                       if(j+1<m){
                           if(!a[i][j+1]){
                               ca[i][j+1]=true;
                               res++;
                           }
                       }
                   }
               }
           }
           a=ca.clone();
       }
       out.println(res);
        out.flush();

    }

    public static int  in()throws IOException {
        in.nextToken();
        return (int)in.nval;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值