【信息学奥赛一本通】1249:Lake Counting

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011735418/article/details/85930268

传送门:Lake Counting

这是一道吓死人的题目,标题是英文,内容是中文,我也被吓了一跳 没有被吓着,很快就进入了状态(心虚啊 我啥也没说),原题如下:

1249:Lake Counting


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 2406     通过数: 1133 

【题目描述】

题意:有一块N×M的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?

【输入】

第一行为N,M(1≤N,M≤110)。

下面为N*M的土地示意图。

【输出】

一行,共有的水洼数。

【输入样例】

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

这个难点就在dx[8],dy[8]上,“一不小心”只写出了dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},完蛋,所以呢,我开局就这么完蛋的 ,这里需要注意一下,其他地方就是“老方法”,bfs()中for语句i要小于8而不是4,这是我的代码(我好像复制错程序了,哦,没有错):

#include<bits/stdc++.h>
using namespace std;
int front,rear,r,c,dx[8]={0,1,0,-1,-1,1,1,-1},dy[8]={1,0,-1,0,1,1,-1,-1},q[10010][2],ans=0;//imax=0;
char a[110][110];
void bfs();
int main()
{
	cin>>r>>c;
	for(int i=0;i<r;i++)
		for(int j=0;j<c;j++)
			cin>>a[i][j];
	for(int i=0;i<r;i++)
		for(int j=0;j<c;j++)
			if(a[i][j]!='.')
			{
				ans++;
				front=0,rear=1;
				q[rear][0]=i,q[rear][1]=j;
				a[i][j]='.';
				bfs();
				//if(imax<rear)
				//	imax=rear;
			}
	cout<<ans;//<<' '<<imax;
	return 0;
}
void bfs()
{
	while(front<rear)
	{
		front++;
		for(int i=0;i<8;i++)
		{
			int xx=q[front][0]+dx[i];
			int yy=q[front][1]+dy[i];
			if(xx>=0&&xx<r&&yy>=0&&yy<c&&a[xx][yy]!='.')
			{
				rear++;
				q[rear][0]=xx;
				q[rear][1]=yy;
				a[xx][yy]='.';
			}
		}
	}
}

 

展开阅读全文

没有更多推荐了,返回首页