## 蓝桥—灌溉(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;
}
}