描述
用一个n*m的二维数组表示地图,1表示陆地,0代表海水,每一格都表示一个1*1的区域。地图中的格子只能横向或者纵向连接(不能对角连接),连接在一起的陆地称作岛屿,同时整个地图都被海水围绕。假设给出的地图中只会有一个岛屿,并且岛屿中不会有湖(即不会有水被陆地包围的情况出现)。请判断所给定的二维地图中岛屿的周长。
输入第一行为n和m,表示地图的大小(1<=n<=100, 1<=m<=100)。接下来n行,每行有m个数,分别描述每一格的数值。数值之间均用空格隔开。输出只有一行,即岛屿的周长(正整数)。样例输入
3 4
1 1 1 0
0 1 0 0
1 1 0 0
样例输出
14
#include<string.h>
#include<stdio.h>
int n,m;
int k=0;
int matrix[105][105];
int flag[105][105];
int step[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int cnt=0;
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int tempx=x+step[i][0];
int tempy=y+step[i][1];
if(tempx<0||tempx>=n||tempy<0||tempy>=m)
{
cnt++;
continue;
}
if(tempx>=0&&tempx<n&&tempy>=0&&tempy<m&&flag[tempx][tempy]==0)
{
if(matrix[tempx][tempy]==0)
{
cnt++;
}
else
{
flag[tempx][tempy]=1;
dfs(tempx,tempy);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int tempx,tempy;
memset(matrix,0,sizeof(matrix));
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&matrix[i][j]);
if(k==0&&matrix[i][j]==1)
{
k=1;
tempx=i;
tempy=j;
}
}
}
flag[tempx][tempy]=1;
dfs(tempx,tempy);
printf("%d\n",cnt);
return 0;
}