题意:
给你一张图,#表示有水的地方,求出图中水面积的最大值。
分析:
很简单,遍历这张图,遇到未被标记的#就把cnt加一,并开始深搜,把搜到的#都标记上,直到八连通被阻断。
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define range(i,a,b) for(int i=a;i<=b;++i) #define rerange(i,a,b) for(int i=a;i>=b;--i) #define LL long long #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; char map[105][105]; int x,y,idx[105][105]; void dfs(int r,int c,int id){ if(r<0||r>=x||c<0||c>=y||(idx[r][c]>0||map[r][c]!='W'))return;//越界或深搜直无水则回溯。 idx[r][c]=id;//标记水块id range(dr,-1,1)range(dc,-1,1) if(dr||dc)dfs(r+dr,c+dc,id);//八连通深搜 } int main(int argc, char *argv[]) { cin>>x>>y; range(i,0,x-1)scanf("%s",map[i]);//输入 fill(idx,0); int cnt=0; range(i,0,x-1)range(j,0,y-1) if(idx[i][j]==0&&map[i][j]=='W')dfs(i,j,++cnt);//遍历图 cout<<cnt<<endl; return 0; }