相链接的陆地均视为向一岛屿。
搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四
个方向扩展,当扩展出的点大于0 时就拥入队列,直到队列扩展完毕。所有被加入到队列的
点的总数就是小岛的面积。假设地图的大小不超过50*50 . 代码实现如下。
广搜实现代码:
#include
struct node
{
int x;
int y;
};
int main(void)
{
struct node que[2501];
int head,tail;
int a[51][51];
int book[51][51]={0};
int i,j,k,sum,max=0,mx,my,n,m,startx,starty,tx,ty;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
scanf("%d%d%d%d",&n,&m,&startx,&starty);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
head=1;
tail=1;
que[tail].x=startx;
que[tail].y=starty;
tail++;
book[starty][starty]=1;
sum=1;
while(headn||ty<1||ty>n)
continue;
if(a[tx][ty]>0&&book[tx][ty]==0)
{
sum++;
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
tail++;
}
}
head++;
}
printf("%d\n",sum);
return 0;
}
深搜代码如下:
#include
int a[51][51];
int book[51][51],n,m,sum;
void dfs(int x,int y)
{
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int k,tx,ty;
for(k=0;k<=3;k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<1||tx>n||ty<1||ty>m)
continue;
if(a[tx][ty]>0&&book[tx][ty]==0)
{
sum++;
book[tx][ty]=1;
dfs(tx,ty);
}
}
return ;
}
int main(void)
{
int i,j,startx,starty;
scanf("%d%d%d%d",&n,&m,&startx,&starty);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
book[startx][starty]=1;
sum=1;
dfs(startx,starty);
printf("%d\n",sum);
return 0;
}