洛谷 P1596
题目大意:
找一块儿地中水池的个数。
基本思路:
找到一个水池块时,将所有与他相连的水池块全部标记。
且不越过旱地块儿。
减枝操作:如果这个水池块儿搜过,那么就不用再搜了。
什么时候更新最大值?
当主函数中的循环,搜到新的水池块儿时,
也是第一次搜到这个点,ans++。
预处理:
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cin>>c;
if(c=='W') k[i][j]=0;//水
else k[i][j]=-1;//地
}
}
void dfs(int x,int y,int s){
//坐标,旁边的数
if(x<0||x>=n||y<0||y>=m) return;//超边界
if(k[x][y]==-1) return;//旱地
if(k[x][y]!=0) return;//同一个水池中该点走过,减枝
if(s==-2&&k[x][y]==0) {
//新的水塘,-2只是表示这是第一次来到这点
ans++;
s=ans;
}
k[x][y]=s;//更新
int i;
for(i=0;i<8;i++){
dfs(x+f1[i],y+f2[i],k[x