開啟章節選單
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; }