開啟章節選單

12882 City Park

題目說明

給定一個平面,以及n塊板子,並告訴你這n塊板子的左下角座標以及寬度長度。 考慮板子之間會相連的情況下,輸出最大板子(相鄰的算同一個板子)的面積。

解題過程

輸入板子的左下角時把座標存進一個List(或vector)中 並儲存到一個很大的整數二維陣列內,其中0代表沒板子,1代表有 輸入完畢後用DFS(或是BFS也可以)來遍歷List,每次遞迴都先檢查自己所在的格子是否為1,是的話就先把所在的格子變成0(紀錄走訪),並向返回1+四個方向繼續遞迴的值 小技巧:儲存座標可以用string或int的方式確保座標的單一性(利用HashCode的精神),並且能夠用比struct更少的字數

考點:圖的遍歷,陣列應用

程式碼

#include <iostream>
#include <vector>
using namespace std;
static int arr[50000][50000] = {0};
int DFS(int a, int b) {
  if (arr[a][b] == 0 || a < 0 || b < 0 || a >= 50000 || b >= 50000) return 0;
  arr[a][b] = 0;
  return DFS(a, b + 1) + DFS(a, b - 1) + DFS(a + 1, b) + DFS(a - 1, b) + 1;
}
int main() {
  vector<int> v;
  int c, x, y, a, b, ans = 0;
  cin >> c;
  for (; c; c--) {
    cin >> x >> y >> a >> b;
    v.push_back(x * 100000 + y);
    for (int i = 0; i < a; i++)
      for (int j = 0; j < b; j++) arr[i + x][j + y] = 1;
  }
  for (int i : v) ans = max(ans, DFS(i / 100000, i % 100000));
  cout << ans;
}