宝岛探险

小哼通过秘密方法得到一张不完整的钓鱼岛航拍地图。的鱼岛由一个主岛和一些附属岛
屿组成,小哼决定去钓鱼岛撩险。下面这个10* 1 0 的二维矩阵就是钓鱼岛的航拍地图。图中
数字表示海拔, 0 表示海洋, I~9 都表示陆地.小哼的飞机将会降落在(6,8)处,现在需要计
算出小哼降藩地所在岛的面积(即有多少个格子〉。注意此处我们把与小哼降落点上下左右

相链接的陆地均视为向一岛屿。

搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四
个方向扩展,当扩展出的点大于0 时就拥入队列,直到队列扩展完毕。所有被加入到队列的
点的总数就是小岛的面积。假设地图的大小不超过50*50 . 代码实现如下。


广搜实现代码:

#include<stdio.h>
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(head<tail)
	{
		for(k=0;k<=3;k++)
		{
			tx=que[head].x+next[k][0];
			ty=que[head].y+next[k][1];
			if(tx<1||tx>n||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<stdio.h>
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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值