xtu p 1168 Lake Counting

本文介绍了一种使用八联通算法解决雨后土地上水洼计数问题的方法。通过定义节点结构体和状态标记数组,利用广度优先搜索遍历地图上的每个位置,将相连的水域标记并计数,最终输出独立水洼的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

有一块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

限制
时间限制: 1000 ms
内存限制: 65536 KB

八联通问题,很简单

struct node{
	int x,y;
}nod;

int n,m;
char dt[110][110];
bool mp[110][110]={false};
int dx[8]={1,-1,0,0,1,-1,1,-1};
int dy[8]={0,0,1,-1,1,1,-1,-1};


bool judge(int x,int y){
	if(x<0||x>=n||y<0||y>=m) return false;
	if(mp[x][y]==true||dt[x][y]=='.') return false;
	return true;
}

void bfs(int a,int b){
	queue<node> q;
	nod.x=a;
	nod.y=b;
	mp[a][b]=true;
	q.push(nod);
	while(!q.empty()){
		node top=q.front();
		q.pop();
		for(int i=0;i<8;i++){
			int newx=top.x+dx[i];
			int newy=top.y+dy[i];
			if(judge(newx,newy)){
				nod.x=newx;
				nod.y=newy;
				q.push(nod);
				mp[newx][newy]=true;
			}
		}
	}
}

int main(){
	scanf("%d%d%*c",&n,&m);
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			scanf("%c",&dt[i][j]);
		}
		scanf("%*c");
	}	
	int sum=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(dt[i][j]=='W'&&mp[i][j]==false){
				sum++;
				bfs(i,j);
			}
		}
	}
	printf("%d\n",sum);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值