自学内容网 自学内容网

蓝桥杯-灌溉

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

#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;
}

 


原文地址:https://blog.csdn.net/zengxuan151168/article/details/136336867

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!