1388:Lake Counting

简介: 题目链接:NOI题库http://noi.openjudge.cn/ch0205/1388/POJ 2386 http://poj.org/problem?id=2386 总时间限制: 1000ms  内存限制: 65536kB描述Due to recent rains, water h...

题目链接:

NOI题库http://noi.openjudge.cn/ch0205/1388/

POJ 2386 http://poj.org/problem?id=2386 

总时间限制: 1000ms  内存限制: 65536kB
描述
Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

Given a diagram of Farmer John's field, determine how many ponds he has.
输入
* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
输出
* Line 1: The number of ponds in Farmer John's field.
样例输入
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
提示
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.

题目大意:

有一块N*M的土地,雨后机起了水,有水标记为'W',干燥标记为'.'。
八连通的积水被认为是连接在一起的。需要求出院子里有多少水洼。
首先输入N和M,然后输入N*M的二维字符数组,行内字符之间没有空格。
输出水洼的数目。
N和M都在100以内。

算法分析:
这道题可以用深搜,也可以用广搜。

扫描二维数组,每遇到一个'W'就从这个地方出发开始深搜或广搜。
搜索过程中,把搜缩遇到的'W'全部设为'.'。
每当完成一次深搜或广搜,水洼数增1.


题解可以参考:
http://blog.csdn.net/c20180630/article/details/52329915
http://www.cnblogs.com/sooner/archive/2013/04/09/3010938.html

深搜的思路:

下面是我自己写的代码,含深搜与广搜的代码:

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<queue>
  4 #include<stack>
  5 using namespace std;
  6 
  7 struct obj
  8 {
  9     int xx,yy;
 10 };
 11 
 12 int N,M;
 13 char a[102][102];
 14 int Count;
 15 
 16 int dx[8]={-1,-1,0,1,1,1,0,-1};//从正上方开始,顺时针旋转的8个方向 
 17 int dy[8]={0,1,1,1,0,-1,-1,-1};
 18 void BFS(int x,int y);//从(x,y)开始广搜 
 19 void DFS(int x,int y);//从(x,y)开始深搜 
 20 void DFS2(int x,int y);//从(x,y)开始深搜,递归实现 
 21 
 22 int main(int argc, char *argv[])
 23 {
 24     freopen("1388.in","r",stdin);
 25     int i,j;
 26     scanf("%d%d",&N,&M);getchar();//吸收回车符 
 27     for(i=0;i<N;i++)
 28     {
 29         gets(a[i]);
 30         /*
 31         for(j=0;j<M;j++)
 32         {
 33             a[i][j]=getchar();
 34         }
 35         getchar();//吸收回车符
 36         */
 37     }
 38     
 39     Count=0;
 40     for(i=0;i<N;i++)
 41     {
 42         for(j=0;j<M;j++)
 43         {
 44             if(a[i][j]=='W')
 45             {
 46                 BFS(i,j);//从(i,j)开始广搜 
 47                 //DFS(i,j);//从(i,j)开始深搜 
 48                 //{ DFS2(i,j); Count=Count+1;} //递归实现的深搜,从(i,j)开始深搜 
 49             }
 50         }
 51     }
 52     printf("%d\n",Count);
 53     return 0;
 54 }
 55 void BFS(int x,int y)//从(x,y)开始广搜
 56 {
 57     queue<struct obj> q;
 58     struct obj start,temp;
 59     int i,txx,tyy;
 60 
 61     start.xx=x;
 62     start.yy=y;
 63     q.push(start);
 64     a[x][y]='.';
 65     while(!q.empty())
 66     {
 67         for(i=0;i<8;i++)
 68         {
 69             txx=q.front().xx+dx[i];
 70             tyy=q.front().yy+dy[i];
 71             if(txx>=0&&txx<N&&tyy>=0&&tyy<M&&a[txx][tyy]=='W')
 72             {
 73                 temp.xx=txx;
 74                 temp.yy=tyy;
 75                 a[txx][tyy]='.';
 76                 q.push(temp);
 77             }
 78         }
 79         q.pop();
 80     }
 81     Count++;
 82 }
 83 
 84 void DFS(int x,int y)//从(x,y)开始深搜 
 85 {
 86     stack<struct obj> s;
 87     struct obj start,temp,temp2;
 88     int i,txx,tyy;
 89     
 90     a[x][y]='.';
 91     start.xx=x;
 92     start.yy=y;
 93     s.push(start);
 94     while(!s.empty())
 95     {
 96         temp=s.top();  s.pop();
 97         for(i=0;i<8;i++)
 98         {
 99             txx=temp.xx+dx[i];
100             tyy=temp.yy+dy[i];
101             if(txx>=0&&txx<N&&tyy>=0&&tyy<M&&a[txx][tyy]=='W')
102             {
103                 temp2.xx=txx;
104                 temp2.yy=tyy;
105                 a[txx][tyy]='.';
106                 s.push(temp2);
107             }
108         }
109     }
110     Count++;
111 }
112 
113 void DFS2(int x,int y)//从(x,y)开始深搜,递归实现
114 {
115     int i,txx,tyy;
116     a[x][y]='.';
117     for(i=0;i<8;i++)
118     {
119         txx=x+dx[i];
120         tyy=y+dy[i];
121         if(txx>=0&&txx<N&&tyy>=0&&tyy<M&&a[txx][tyy]=='W')
122         {
123             //a[txx][tyy]='.';
124             DFS2(txx,tyy);
125         }
126     }
127 }

 

相关文章
|
7月前
|
存储 SQL Apache
Apache Hudi与Delta Lake对比
Apache Hudi与Delta Lake对比
106 0
|
7月前
|
存储 数据采集 大数据
Data Lake架构揭秘
Data Lake架构揭秘
88 0
|
流计算
Delta Lake中CDC的实现
Delta Lake中CDC的实现
159 0
|
弹性计算 缓存 网络协议
阿里云Intel Xeon Platinum 8163(Skylake)或者8269CY(Cascade Lake)
阿里云Intel Xeon Platinum 8163(Skylake)或者8269CY(Cascade Lake),阿里云服务器u1通用算力型Universal实例高性价比,CPU采用Intel(R) Xeon(R) Platinum,主频是2.5 GHz,云服务器U1实例的基准vCPU算力与5代企业级实例持平,最高vCPU算力与6代企业级实例持平,提供2c-32c规格和1:1/2/4/8丰富配比,阿里云服务器u1适用于Web应用及网站,企业办公类应用,数据分析和计算等大多数通用的对vCPU算力和性能要求不高的应用场景
1684 0
《Next Generation of Intel XEON® Processor Hero Features Review》电子版地址
Next Generation of Intel XEON® Processor Hero Features Review
78 0
《Next Generation of Intel XEON® Processor Hero Features Review》电子版地址
|
SQL 存储 分布式计算
数据湖揭秘—Delta Lake
Delta Lake 是 DataBricks 公司开源的、用于构建湖仓架构的存储框架。能够支持 Spark,Flink,Hive,PrestoDB,Trino 等查询/计算引擎。作为一个开放格式的存储层,它在提供了批流一体的同时,为湖仓架构提供可靠的,安全的,高性能的保证。
4097 7
数据湖揭秘—Delta Lake
|
定位技术 C++
洛谷P1596-[USACO10OCT]湖计数Lake Counting(DFS)
洛谷P1596-[USACO10OCT]湖计数Lake Counting(DFS)
|
SQL 分布式计算 搜索推荐
《 Delta Lake 数据湖专题系列5讲》文章回顾
《Delta Lake 数据湖专题系列5讲》由阿里云 DDI 团队翻译整理自大数据技术公司 Databricks 针对数据湖 Delta Lake 系列技术文章。阅读完此系列文章可以帮助您达到入门级,对数据湖 Lakehouse 有整体上的认识和应用,掌握理论知识体系。
《 Delta Lake 数据湖专题系列5讲》文章回顾