给一个二维数组,假设只有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;