华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 950|回复: 1
打印 上一主题 下一主题

P1596 [USACO10OCT]Lake Counting S

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2021-5-17 16:33:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
https://www.luogu.com.cn/problem/P1596

题目描述

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个NxM(1<=N<=100;1<=M<=100)网格图表示。每个网格中有水('W') 或是旱地('.')。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。

输入格式
第1行:两个空格隔开的整数:N 和 M 第2行到第N+1行:每行M个字符,每个字符是'W'或'.',它们表示网格图中的一排。字符之间没有空格。
输出格式
一行:水坑的数量

输入输出样例
输入 #1复制
  1. 10 12
  2. W........WW.
  3. .WWW.....WWW
  4. ....WW...WW.
  5. .........WW.
  6. .........W..
  7. ..W......W..
  8. .W.W.....WW.
  9. W.W.W.....W.
  10. .W.W......W.
  11. ..W.......W.
复制代码


输出 #1复制
3
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2021-5-17 16:36:57 | 只看该作者
和1451几乎一样,改动8个方向就是。一次AC。
  1. #include<iostream>
  2. using namespace std;
  3. const int mm=110;
  4. int m,n,x;
  5. int a[mm][mm]; ///原始棋盘
  6. int v[mm][mm]; ///是否被访问
  7. int dr[]= {0,+1,+1,+0,-1,-1,-1,+0,+1};
  8. int dc[]= {0,+0,+1,+1,+1,+0,-1,-1,-1};
  9. void check()  ///检查a数组和v数组
  10. {
  11.         for (int r=1; r<=m; r++,cout<<endl)
  12.                 for (int c=1; c<=n; c++) cout<<a[r][c];
  13.         for (int r=1; r<=m; r++,cout<<endl)
  14.                 for (int c=1; c<=n; c++) cout<<v[r][c];
  15. }
  16. void dfs(int r ,int c,int x) ///从rc处开始给区域染色为x
  17. {
  18.         a[r][c]=x,v[r][c]=1;
  19.         ///cout<<r<<' '<<c<<endl;check();int y;cin>>y;
  20.         for (int i=1; i<=8; i++)
  21.                 {
  22.                         int tr=r+dr[i],tc=c+dc[i];
  23.                         if (a[tr][tc]!=0 && v[tr][tc]==0)dfs(tr,tc,x);
  24.                 }
  25. }

  26. int main()
  27. {
  28.         cin>>m>>n;
  29.         for (int r=1; r<=m; r++)
  30.                 for (int c=1; c<=n; c++)
  31.                         {
  32.                                 char ch;cin>>ch;
  33.                                 a[r][c]=(ch=='W');
  34.                         }
  35.         for (int r=1; r<=m; r++)
  36.                 for (int c=1; c<=n; c++)
  37.                         if (a[r][c]!=0 && v[r][c]==0) dfs(r,c,++x);
  38. //check();
  39.         cout<<x;
  40.         return 0;
  41. }

  42. /*
  43. 10 12
  44. W........WW.
  45. .WWW.....WWW
  46. ....WW...WW.
  47. .........WW.
  48. .........W..
  49. ..W......W..
  50. .W.W.....WW.
  51. W.W.W.....W.
  52. .W.W......W.
  53. ..W.......W.
  54. */
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:41 , Processed in 0.106625 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表