[PS規格-4.7]2571号:色紙-3


問題情報
白駿2571号-ショートカット
  • 難易度:金貨3
  • アルゴリズム:分割征服
  • コメント
    この問題は分割征服で失敗に近づいた...それ以外にも、いろいろな方向に挑戦したことがありますが、最終的にはブルートフォース(六重複文)で解決しました.
  • 先100×100100\times100100×100の配列は0にリセットされ、色紙領域に含まれる領域は111になります.(感覚と掃雷ゲームは時差が少ない)
  • 100×100100\times100100×100配列のすべての要素を探索します.要素が0を超えると、色紙が重なる領域であり、その点から色紙領域の幅を再探索する.
  • カラー紙領域の幅はゼロであり、横方向、縦方向の検索により幅、高さを探します.
  • 幅、高さの矩形領域にゼロの値がある場合、空白領域があるため、矩形は破棄されます.いずれも0より大きい場合は、現在の面積と最大値を比較して最大値を更新します.
  • ソースコード
    #include <iostream>
    #include <string>
    #include <cmath>
    #include <vector>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    
    int main() {
    	int n;
    	cin >> n;
    
    	int arr[101][101]{ 0, };
    	int max = 0;
    
    	for (int i = 0; i < n; i++) {
    		int x, y;
    		cin >> x >> y;
    
    		for (int j = 0; j < 10; j++) {
    			for (int k = 0; k < 10; k++) {
    				arr[x + j][y + k]++;
    			}
    		}
    	}
    
    	int areas = 0;
    
    	for (int i = 1; i < 101; i++) {
    		for (int j = 1; j < 101; j++) {
    			if (arr[i][j] > 0) {
    				// width, height 구해서 넓이 구하기
    				int width = 1;
    				int height = 1;
    				for (int a = i; a < 101; a++) {
    					if (arr[a][j] > 0) {
    						width++;
    					}
    					if (arr[a - 1][j] > 0 && arr[a][j] == 0) {
    						break;
    					}
    
    				}
    				for (int a = j; a < 101; a++) {
    					if (arr[i][a] > 0) {
    						height++;
    					}
    					if (arr[i][a-1] > 0 && arr[i][a] == 0) {
    						break;
    					}
    
    				}
    
    				// width, height만큼 영역 만들고 하나씩 줄여가며 전부 0보다 큰지 검사하고, 크면 max랑 비교해서 넓이 대입
    				for (int w = i + width; w > i; w--) {
    					for (int h = j + height; h > j; h--) {
    						bool flag = true;
    						for (int a = i; a < w; a++) {
    							for (int b = j; b < h; b++) {
    								if (arr[a][b] == 0) {
    									flag = false;
    									break;
    								}
    							} if (!flag) break;
    						}
    
    						if (flag) {
    							int area = (w-i) * (h-j);
    							max = max > area ? max : area;
    						}
    					}
    				}
    				//cout << "[i = " << i << ", j = " << j << " ] : " << "width = " << width << " height = " << height << " area = " << width*height << endl;
    				/*int area = width * height;
    				max = max > area ? max : area;*/
    			}
    		}
    	}
    	cout << max;
    }