其他分享
首页 > 其他分享> > 2021秋季《数据结构》_EOJ 1085.华师大卫星照片

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

作者:互联网

题目

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

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

…*…**

.***

.

…*.

…*.

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

思路

摆了好久没写oj了)

代码

#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;
}

标签:华师大,tx,ty,int,EOJ,sum,1085,dfs,book
来源: https://blog.csdn.net/rd142857/article/details/121652949