题目描述
小蓝负责花园的灌溉工作。
花园可以看成一个 nn 行 mm 列的方格图形。中间有一部分位置上安装有出水管。
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 kk 分钟后,有多少个方格被灌溉好?
输入描述
输入的第一行包含两个整数 n,mn,m。
第二行包含一个整数 tt,表示出水管的数量。
接下来 tt 行描述出水管的位置,其中第 ii 行包含两个数 r,cr,c 表示第 rr 行第 cc 列有一个排水管。
接下来一行包含一个整数 kk。
其中,1≤n,m≤100,1≤t≤10,1≤k≤1001≤n,m≤100,1≤t≤10,1≤k≤100。
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
3 6
2
2 2
3 4
1
输出
9
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
分析:
读懂题意了这道题不难。注意的是每过一分钟,出水口上下左右四个方格就会住满水。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
int m,n;
int a[101][101] = {0};
int b[101][101] = {0};
scanf("%d%d",&m,&n);
int t;
int k;
scanf("%d",&t);
int r,c;
for(int i = 0; i<t; i++) {
scanf("%d%d",&r,&c);
a[r][c] = 1;
b[r][c] = 1;
}
scanf("%d",&k);
while(k) {
for(int i = 1; i<m+1; i++) {
for(int j = 0; j<n+1; j++) {
if(a[i][j] == 1) {
b[i-1][j] = 1;
b[i+1][j] = 1;
b[i][j-1] = 1;
b[i][j+1] = 1;
}
}
}
memcpy(a,b,sizeof(b));
k--;
}
int count = 0;
// for(int i = 1; i<m+1; i++) {
// for(int j = 1; j<n+1; j++) {
// printf("%d",a[i][j]);
// }
// printf("\n");
// }
for(int i = 1; i<m+1; i++) {
for(int j = 1; j<n+1; j++) {
if(a[i][j] == 1)
count++;
}
}
printf("%d",count);
return 0;
}