题目描述
小蓝负责花园的灌溉工作。
花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?
输入描述
输入的第一行包含两个整数 n,m。
第二行包含一个整数 t,表示出水管的数量。
接下来 tt 行描述出水管的位置,其中第 i 行包含两个数 r,c 表示第 r 行第 c 列有一个排水管。
接下来一行包含一个整数 k。
其中,1≤n,m≤100,1≤t≤10,1≤k≤100。
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
3 6
2
2 2
3 4
1
输出
9
运行限制
最大运行时间:1s
最大运行内存: 128M
所需变量
int a[10005];//用来存储哪个点被灌溉
int b[10005];//跟a数组一样
int n;//用于代表这个农田的行数
int m;//用于代表这个农田的列
int sum;//用于统计最后有多少个点被灌溉
int t;//代表有多少个水龙头
int r;//用于接收这个数的行
int c;//用于接收这个水龙头所在的列
int k;//代表多少分钟
int i,j;//循环变量
int control = 0;//0代表以a为基准,往b数组扩散,1代表相反
int s;//s代表循环变量,控制具体到了多少分钟
思路:我们首先将所有数都从二位转到一维数组,即对于一个r行c列
的数我们转换到一维数组是(r-1)*m + c - 1
然后将每次被灌溉或者是有水龙头的我都赋值为1,不断遍历下去就能得到最终答案!
首先我们需要输入进来,然后将其转化为一维数组:
cin>>n>>m;cin>>t;for(i = 0;icin>>r>>c;a[(r-1)*m + c - 1] = 1;}
然后判断这个现在是a数组转到b数组还是b数组转到a数组,然后不断地向周围扩散,将周围都赋值为1;
cin>>k;for(s = 1;s<=k;s++){for(i = 0;ifor(j = 0;jif(control == 0){if(a[i*m +j] == 1){b[(i-1)*m+j] = 1;b[i*m +j-1] = 1;b[i*m + j] = 1;b[i*m +j + 1] = 1;b[(i+1)*m + j] = 1;}}else{if(b[i*m +j] == 1){a[(i-1)*m+j] = 1;a[i*m +j-1] = 1;a[i*m + j] = 1;a[i*m +j + 1] = 1;a[(i+1)*m + j] = 1;}}}}control = (control+1)%2;}
最终将得到的结果循环遍历,每次只要该位为1,那么我们就sum++,最后将sum的结果打印出来
代码如下(编译器是dev,语言是C语言):
#include
using namespace std;
int main()
{int a[10005] = {0},b[10005] = {0},n,m,sum = 0,t,r,c,k;int i,j,control = 0,s;//0代表用b,1代表用acin>>n>>m;cin>>t;for(i = 0;icin>>r>>c;a[(r-1)*m + c - 1] = 1;}cin>>k;for(s = 1;s<=k;s++){for(i = 0;ifor(j = 0;jif(control == 0){if(a[i*m +j] == 1){b[(i-1)*m+j] = 1;b[i*m +j-1] = 1;b[i*m + j] = 1;b[i*m +j + 1] = 1;b[(i+1)*m + j] = 1;}}else{if(b[i*m +j] == 1){a[(i-1)*m+j] = 1;a[i*m +j-1] = 1;a[i*m + j] = 1;a[i*m +j + 1] = 1;a[(i+1)*m + j] = 1;}}}}control = (control+1)%2;}for(i = 0;iif(a[i] == 1||b[i] == 1){sum++;}}cout<