题目链接:http://poj.org/problem?id=1164。
思路:这道题目给出了一个城堡的地图,要我们根据地图求出城堡中房间数和最大房间的面积。关键就是利用DFS来求连通分块数,再利用一个全局变量maxArea记录最大房间面积。代码实现如下:
#include <iostream>
using namespace std;
struct G
{
int dire[4];//0:d, 1:r, 2:u, 1:l
} g[50][50];
bool visit[50][50];
int m, n;
int base[4] = {8, 4, 2, 1};
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int maxArea = 0;
void init(int i, int j, int num) {
for (int k = 0; k < 4; k++) {
if (num >= base[k]) {
g[i][j].dire[k] = 1;
num -= base[k];
}
}
}
void DFS(int x, int y, int &area) {
visit[x][y] = true;
area++;
maxArea = max(maxArea, area);
for (int i = 0; i < 4; i++) {
if (!g[x][y].dire[i]) {
int tx = x + dx[i];
int ty = y + dy[i];
if (!visit[tx][ty]) DFS(tx, ty, area);
}
}
}
int main() {
int num;
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> num;
init(i, j, num);
}
}
int cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!visit[i][j]) {
int area = 0;
DFS(i, j, area);
cnt++;
}
}
}
cout << cnt << endl << maxArea << endl;
return 0;
}