2021秋季《数据结构》_EOJ 1085.华师大卫星照片

题目

jim 通过 Google 得到了华师大WH像素的卫星照片( 1 ≤ W ≤ 80 , 1 ≤ H ≤ 1000 1\leq W\leq 80,1\leq H\leq 1000 1W80,1H1000 ,希望找出最大的 ” 连续的 “(互相连接的) 建筑。对于一个建筑的任何一对像素,其中一个像素如果能横向的或纵向的与属于这个建筑的另一个像素相连,这样的建筑称作是连续的。每一张照片都数字化了,建筑区显示为 ““, 非建筑区显示为 “.”。

下面是一个 10 × 5 的卫星照片样例 :

…*…**

.***

.

…*.

…*.

这张照片显示了大小分别为 4、16、6 个像素的连续建筑区。帮助 jim 在他的每张卫星照片中找到最大的连续建筑。
在这里插入图片描述

思路

摆了好久没写oj了)

  • 嗯dfs,需要注意的是sum的取值,本来把sum作为全局变量,在dfs内部比较,但这样会导致sum的多余更新,使得答案比真实结果更小。参考了讨论区,将每个局部变量sum传参进入dfs
  • 把h和w以不同形式弄反了好几次,需要注意
    • define
    • 声明地图和画地图

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXH 1001
#define MAXW 81

int w, h;
int book[MAXH][MAXW] = { {0} };
// 0:未走过
char Map[MAXH][MAXW];
int dir[4][2] = {
	{1,0},{-1,0},{0,1},{0,-1}
};

int maxSum = 0;
void dfs(int x, int y, int& sum)
{
	if (!(x >= 1 && x <= h && y >= 1 && y <= w))
		return;
	for (int i = 0; i < 4; i++)
	{
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		// 是建筑且没走过
		if (Map[tx][ty] == '*' && book[tx][ty] == 0)
		{
			sum++;
			book[tx][ty] = 1;
			dfs(tx, ty, sum);
		}
	}
	return;
}


int main()
{
	cin >> w >> h;
	for (int i = 1; i <= h; i++)
	{
		for (int j = 1; j <= w; j++)
		{
			char tmp; cin >> tmp;
			Map[i][j]=tmp;
			book[i][j]=0;
		}
	}
    
    
	for (int i = 1; i <= h; i++)
	{
		for (int j = 1; j <= w; j++)
		{
			if (Map[i][j] == '*' && book[i][j] == 0)  // 找到没走过的建筑点
			{
				int sum = 1;
				book[i][j] = 1;
				dfs(i, j, sum);
				if (sum > maxSum)
					maxSum = sum;
			}
		}
	}
	cout << maxSum << endl;


	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值