深广搜宝岛探险

0表示海洋,1-9表示陆地,小哼降落在(6,8),计算出小哼降落的小岛的面积

1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
#include<iostream>
using namespace std;
/*
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
*/
int n,m,startx,starty,head,tail,sum=0,tx,ty;
const int maxn=1000;
int next[4][2]={1,0,-1,0,0,1,0,-1};
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
struct Queue{
	int x;
	int y;
};
Queue queue[500];
int main()
{
	cin>>n>>m>>startx>>starty;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>arr[i][j];
		}
	}
	head=1;
	tail=1;
	
	//小哼落点 
	queue[tail].x=startx;
	queue[tail].y=starty;
	mark[queue[tail].x][queue[tail].y]=1;
	sum++;
	tail++;
	while(head<tail)
	{
		//开始4个方向探索 
		for(int i=0;i<=3;i++)
		{
			//将head的4个子方向进队 
			tx=queue[head].x+next[i][0];
			ty=queue[head].y+next[i][1];
			if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
			if(arr[tx][ty]!=0&&mark[tx][ty]==0)
			{
				queue[tail].x=tx;
				queue[tail].y=ty;
				mark[queue[tail].x][queue[tail].y]=1;
				sum++;
				tail++;
			}
		}
		//4个子方向全部进队结束,然后头出队 
		head++;
	}
	cout<<sum;
	return 0;
}
#include<iostream>
using namespace std;
const int maxn=1000;
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
int next[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,startx,starty,sum=0;
void dfs(int x,int y)
{
	int tx,ty;
	sum++;
	for(int i=0;i<=3;i++)
	{
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
		if(arr[tx][ty]!=0&&mark[tx][ty]==0)
		{
			mark[tx][ty]=1;
			dfs(tx,ty);
		}
	}
	return ;
}
int main()
{
	cin>>n>>m>>startx>>starty;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>arr[i][j];
		}
	}
	mark[startx][starty]=1;
	dfs(startx,starty);
	cout<<sum;
	return 0;
} 

输出地图上独立小岛的个数

#include<iostream>
using namespace std;
const int maxn=1000;
int arr[maxn][maxn];
int mark[maxn][maxn]={0};
int next[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,startx,starty,sum=0,color=-1,num=0;
void dfs(int x,int y,int color)
{
	int tx,ty;
	sum++;
	arr[x][y]=color;
	for(int i=0;i<=3;i++)
	{
		tx=x+next[i][0];
		ty=y+next[i][1];
		if(tx<0||tx>n-1||ty<0||ty>m-1)continue;
		if(arr[tx][ty]!=0&&mark[tx][ty]==0)
		{
			mark[tx][ty]=1;
			dfs(tx,ty,color);
		}
	}
	return ;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>arr[i][j];
		}
	}
    //遍历所有点
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
            //满足的陆地条件以及没有降落过的条件过的点
			if(arr[i][j]!=-1&&arr[i][j]!=0)
			{
				mark[i][j]=1;
				dfs(i,j,color);
				num++;
			}

		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			printf("%3d",arr[i][j]);
		}
		cout<<endl;
	}
	cout<<num;
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值