DFS 水题Lake Counting

来源:互联网 发布:广州软件开发工资 编辑:程序博客网 时间:2024/06/05 20:17
由于最近的降雨,水已经在农民约翰的田野中的各个地方聚集,这是由N×M(1 <= N <= 100; 1 <= M <= 100)广场的矩形表示的。 每个广场都有水('W')或干地(''')。 农民约翰想知道在他的领域已经形成了多少个池塘。 一个池塘是连接在一起的正方形的水,在那里一个正方形被认为是邻近所有八个邻居
给出了约翰农场的图表,确定他有多少池塘。
输入
*行1:两个空格分隔的整数:N和M <br> <br> *行2..N + 1:每行代表一行农夫约翰字段的M个字符。 每个角色都是“W”或“。”。 角色之间没有空格。
产量
第1行:农民约翰的田野中的池塘数量。
样品输入

10 12

W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.


样品输出

3

刚开始不懂题目的意思,上网百度还是看不懂,然后问了同学,发现很水,就是找连在一起的块数,样例中即有3个(联通规则为9宫格的中心可以到其他的8个位置)

DFS直接解决,注意9宫格中心和其他8个格子在坐标的关系

void DFS(int row,int col){    if(1>row&&row>N&&col<1&&col>M)        return ;    s[row][col]='.';    for(int i=0;i<8;i++)    {        int x=row+dir[i].x;        int y=col+dir[i].y;        if(s[x][y]=='W'){            DFS(x,y);        }    }}int main(){   cin>>N>>M;    for(int i=1;i<=N;i++)        for(int j=1;j<=M;j++)         cin>>s[i][j];    int  cnt=0;    for(int i=1;i<=N;i++)      for(int j=1;j<=M;j++){        if(s[i][j]=='W')        {            DFS(i,j);            cnt++;        }    }    cout<<cnt<<endl;    return 0;}


原创粉丝点击