本题是一道基于模拟思想的题目,核心思想是构建一个哈希表(如数组)存储这个花园,然后通过0,1标记灌溉与未灌溉。写个灌溉函数,最后通过0或1的个数即可求解。
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int t; //出水管的数量
pair<int,int>p;
const int N=110;
int b[N][N];
int cnt=0;
void judge(int i,int j)
{
b[i][j]=1;
if(!b[i][j+1])
{
b[i][j+1]=1;
}
if(!b[i][j-1])
{
b[i][j-1]=1;
}
if(!b[i+1][j])
{
b[i+1][j]=1;
}
if(!b[i-1][j])
{
b[i-1][j]=1;
}
}
int main()
{
memset(b,0,sizeof(b));
cin>>n>>m;
cin>>t;
while(t--) //第一分钟浇水完成
{
cin>>p.first>>p.second;
judge(p.first-1,p.second-1);
}
cin>>k;
int t=k-1;
if(k>1) //1分钟之后开始灌溉
{
while(t--)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]==1)
{
judge(i,j);
}
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]==1)
{
cnt++;
}
}
}
cout<<cnt<<endl;
return 0;
}
注意此题如果处理不好,容易超时,因为设计到双重循环,时间负责度为O(n^2),数据规模为100*100=1e4。