题目
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了)
- 嗯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;
}