[58]完美矩形-小米2018秋

1.题目描述

给定n个轴对齐的矩形其中n>0, 判断他们组合在一起能否覆盖一个完美的矩形区域(无重叠,无空隙)每个矩形使用左下和右上的点表示。例如,一个矩形的定义为[1,1,2,2],(左下坐标点(1, 1)和右上坐标点(2, 2)的一个单元的正方形)。

  • 输入描述:
    输入包含一组数据,有n行,每行代表一个矩形(左下坐标点和右上坐标点),数字用空格隔开。 输出描述:
    对于每个测试实例,输出能否组合覆盖一个矩形(true/false)。
  • 输入样例:
    1 1 3 3 
    3 1 4 2 
    3 2 4 4 
    1 3 2 4 
    2 3 3 4
    
  • 输出样例:
    true
    

2.题目解析

穷举法,本题有一定难度,需要遍历每个矩形,遍历过程中与前面矩形是否有重叠(顶点是否重合),并调整最小公共父矩形的数值,最后判断所有矩形面积是否与父矩形一样。

3.参考答案

#include <bits/stdc++.h> 
using namespace std; 
bool isRectangleCover(vector<vector<int>>& rectangles) { 
    unordered_set<string> st; // 顶点集合 
    int min_x = INT_MAX, 
    min_y = INT_MAX, 
    max_x = INT_MIN, 
    max_y = INT_MIN, 
    area = 0; // 所有矩形面积之和
    for (auto rect : rectangles) { // 遍历所有矩形 
        // 所能组成最大矩形
        min_x = min(min_x, rect[0]); 
        min_y = min(min_y, rect[1]); 
        max_x = max(max_x, rect[2]); 
        max_y = max(max_y, rect[3]); 

        area += (rect[2] - rect[0]) * (rect[3] - rect[1]); // 面积求和
        // 四个顶点
        string s1 = to_string(rect[0]) + "_" + to_string(rect[1]); // bottom-left 
        string s2 = to_string(rect[0]) + "_" + to_string(rect[3]); // top-left 
        string s3 = to_string(rect[2]) + "_" + to_string(rect[3]); // top-right
        string s4 = to_string(rect[2]) + "_" + to_string(rect[1]); // bottom-right
        // 每个顶点三种情况
        if (st.count(s1)) st.erase(s1); else st.insert(s1); 
        if (st.count(s2)) st.erase(s2); else st.insert(s2); 
        if (st.count(s3)) st.erase(s3); else st.insert(s3); 
        if (st.count(s4)) st.erase(s4); else st.insert(s4);
    } 
    // 最大矩形的四个顶点
    string t1 = to_string(min_x) + "_" + to_string(min_y); 
    string t2 = to_string(min_x) + "_" + to_string(max_y); 
    string t3 = to_string(max_x) + "_" + to_string(max_y); 
    string t4 = to_string(max_x) + "_" + to_string(min_y); 
    if ( !st.count(t1) 
        || !st.count(t2) 
        || !st.count(t3) 
        || !st.count(t4) 
        || st.size() != 4) 
        return false; 
    // 面积
    return area == (max_x - min_x) * (max_y - min_y); 
} 

int main() { 
    int n = 0;
    scanf("%d",&n);
    vector<vector<int> > rect; 
    for(int i = 0; i < n; i++) { 
        vector<int> v; 
        for(int j = 0; j < 4; j++) { 
            int x; 
            scanf("%d",&x); 
            v.push_back(x); 
        } 
        rect.push_back(v); 
    } 
    if(isRectangleCover(rect)) 
        printf("true\n"); 
    else 
        printf("false\n"); 
}

牛客题目

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,960评论 0 2
  • 9月6日 今天6点整,我喊可可起床!我去厨房端来早饭!看她还没起,又喊了一遍,终于看见她坐起来穿衣服了!洗脸刷牙,...
    人间十六月阅读 1,603评论 0 4
  • 阴雨 寒冷 夜晚 争吵 嘶吼 哭泣 这是我在十九岁的生涯里经历的最后一个堪称糟糕透顶的夜晚 有些人有些事属于过去 ...
    _Autumn_阅读 803评论 0 0
  • 围城里有句话这样说到,结婚,就像漆了金的笼子,里面的鸟想飞出去,外面的鸟想冲进来, 对于这句话你们有怎样的看法...
    海情01阅读 1,562评论 0 1
  • 一直在爬楼。 买了千聊和微课上的几个课程,也有几个学习群,可是却没有时间学习,看来我的时间管理出了问题。 看了群里...
    伟伟动听2021阅读 1,580评论 0 0

友情链接更多精彩内容