面试100题系列之9找连通区域

给一个二维数组,假设只有0,1标记,找出标记1可以连通的区域,这里只考虑上下左右四个方向。
从左到右,从上到下扫描二维数组,如果当前节点在地图中为1,那么影响它所属的连通区域标号的就只有上和左,这样就分为下面四种情况:
1、上和左在地图上都是1,并且连通区域标号不同,那就合并这两个区域,并将总的区域数减1,新的连通区域标号设置为上和左中最小的一个。如果相同,就直接设值,不用合并。
2、只有上为1,则直接设为上的区域标号。
3、只有左为1,则直接设为左的区域标号。
4、否则,新建一个区域标号。

 

#include<stdio.h>
#include<string.h>

//地图数组
int Map[100][100];
//标记数组
int flag[100][100];
//连通区域序号
int set[100];

//找到最小的连通区域标号
int find(int k)
{
	int r = set[k];
	while(r != set[r])
	{
		r = set[r];
	}
	return r;
}

//地图为m行n列,边界上加了一圈0,防止越界
int FindConnectArea(int m, int n)
{
	if(m < 1 || n < 1)
		return 0;
	int count = 0;
	int t = 0;
	int i,j;
	int r1, r2;
	int Temp;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值