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
思路:
本题属于模拟,只需将岛屿存入二维数组,然后根据每个大陆点上下左右的情况决定len是否++
我的代码:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
//freopen("input.txt","r",stdin);
int n,m;
while(cin>>n>>m)
{
int len=0;
int daoyu[n][m];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>daoyu[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
//上
if(i==0)
{
if(daoyu[i][j]==1) len++;
}
else
{
if(daoyu[i][j]==1&&daoyu[i-1][j]==0) len++;
}
//下
if(i==n-1)
{
if(daoyu[i][j]==1) len++;
}
else
{
if(daoyu[i][j]==1&&daoyu[i+1][j]==0) len++;
}
//左
if(j==0)
{
if(daoyu[i][j]==1) len++;
}
else
{
if(daoyu[i][j]==1&&daoyu[i][j-1]==0) len++;
}
//右
if(j==m-1)
{
if(daoyu[i][j]==1) len++;
}
else
{
if(daoyu[i][j]==1&&daoyu[i][j+1]==0) len++;
}
}
}
cout<<len;
}
return 0;
}
也有大神从第一行开始存地图,每个方向的变化被数字化为一个二维数组,如下(参考链接)
#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;
}