C:岛屿周长
总时间限制:
1000ms 内存限制: 65536kB-
描述
-
用一个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
来源
cs10116 final exam
题型/思路
设置map二维数组存储每个节点的状态,对于矩阵中的每一个节点,遍历他的上下左右四个方向。如果该节点的邻居节点是海,则该节点为边界节点,周长len++。
AC代码
#include <iostream>
#include<cstring>
using namespace std;
const int nmax=100+50;
const int mmax=100+50;
int map[nmax][mmax];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向数组,对于某一节点遍历上下左右四个方向
int main(int argc, char** argv) {
int n,m;
while(cin>>n>>m){
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++){ //初始化map数组
for(int j=1;j<=m;j++){
scanf("%d",&map[i][j]);
}
}
int len;//周长
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]==1){
for(int k=0;k<4;k++){//遍历上下左右四个方向
int tx=i+d[k][0];
int ty=j+d[k][1];
if(map[tx][ty]==0){//若果某一节点的节点是海
len++;
}
}
}
}
}
printf("%d\n",len);
}
return 0;
}