参考了大佬的解题思路,先遍历一次花园,找到所有的水源坐标,把它们存入 “水源坐标清单” 数组内,再读取数组里的水源坐标进行扩散。
#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;
}