参考了大佬的解题思路,先遍历一次花园,找到所有的水源坐标,把它们存入 “水源坐标清单” 数组内,再读取数组里的水源坐标进行扩散。
#include <iostream>
using namespace std;
int main()
{
int n,m,t,r,c,k,ans=0,list_i=0;
cin>>n>>m;
cin>>t;
int gd[n][m],waterlist[10000][2]={0}; //水源清单
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
gd[i][j]=0;
while(t--)///t个水管
{
cin>>r>>c;
gd[r-1][c-1]=1; //记住位置是要减一
}
cin>>k;
while(k--)//k次遍历
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(gd[i][j]==1)
{
waterlist[list_i][0]=i;
waterlist[list_i][1]=j;
list_i++;
}//进行水源标记
}
}
for(int i=0;i<list_i;i++)
{
gd[waterlist[i][0]] [waterlist[i][1]]=1;//自身会被浇灌
if (waterlist[i][1]+1<=n+1)
gd[waterlist[i][0]][waterlist[i][1]+1] += 1;
if (waterlist[i][1]-1>=0)
gd[waterlist[i][0]] [waterlist[i][1]-1] += 1;
if(waterlist[i][0]+1<=m+1)
gd[waterlist[i][0]+1] [waterlist[i][1]] += 1;
if(waterlist[i][0]+1>=0)
gd[waterlist[i][0]-1] [waterlist[i][1]] += 1;
}//将所有水源标记完后再进行浇灌 ,判断边界
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
ans+=gd[i][j];//
cout<<ans;
return 0;
}