链接:https://leetcode-cn.com/problems/perfect-rectangle/description/

题目

我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。

每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。

思路

首先,rectangles[][]数组里保存的每个小矩形,都有4个角.

以示例4的rectangles[0]矩形的左下角为例:

因为rectangles[0]等于{1,1,3,3},所以左下角为(1,1),处于的位置为{0,1}

所以,下面程序便通过一个 method[4][2]数组来存储4个角度的标志位,方便调用4个角出来:

int method[][]={{,},{,},{,},{,}};     //左下,右上,左上,右下 

由于需要多个小矩形凑成的大矩形,且不能有相交区域,所以应该共有4个独立的角

比如示例1,就有4个独立的角

而示例4,有相交区域,所以不止超过4个独立的角:

除了计算独立的角以外,还要计算矩形是否重叠过,以及核对矩形面积.

比如下例所示,同样,也是4个独立的角,不仅有相交区域,而且还不是一个矩形区域:

rectangles = [
[,,,],
[,,,],
[,,,],
]

绘制成图后:

所以在代码里,需要定义2个数组

一个用来存储角的位置,以及左下,右上,左上,右下的标志位。

另一个用来存储矩形区域的left,low,right,top的范围,用来核对面积用。

当我们每取出来一个角,都需要去匹配是否与以前的角重叠,为了效益需要用到Hash表,C语言没有Hash表函数,所以我们还需要自己来编写Hash表函数

代码如下:

#define  AREA(rectang)        ((rectang[3]-rectang[1])*(rectang[2]-rectang[0]))
#define Index(x,y,Hashlen) ((x*x+y*y)%Hashlen) void Hash_Init(int Hash[][],int len)
{
for(int i=;i<len;i++)
{
Hash[i][]=;
}
}
//首先查找表,如果存在,则检查该角度是否被重叠,如果不存在,则插入表
bool Hash_search_insert(int Hash[][],int x,int y,int angle,int *angles,int len)
{
int addr=Index(x,y,len); //求哈希地址
int tmp =addr;
//查找
while(Hash[addr][]==)
{
if(Hash[addr][]==x&&Hash[addr][]==y) //已找到
{
if(Hash[addr][angle]==) //未重叠
{
if(Hash[addr][]==) // 是否 合并 过
{
Hash[addr][]=;
(*angles)--;
}
Hash[addr][angle]=; //设为占用
return true;
}
else //已重叠
return false;
}
addr = (addr+)% len;
if(addr==tmp) //未找到
return false;
}
//Hash[addr][7]等于0,说明没找到,则插入表
Hash[addr][]=;
Hash[addr][]=x;
Hash[addr][]=y;
Hash[addr][]=; //未合并过
(*angles)++;
for(int i=;i<;i++) //左下,右上,左上,右下
if(i==angle)
Hash[addr][i]=;   
else
Hash[addr][i]=;
return true;
} bool isRectangleCover(int** rectangles, int rectanglesRowSize, int rectanglesColSize)
{
int i,j,k,angle=,cnt=;
int Hashlen=rectanglesRowSize*;
int s[Hashlen][]; // x y 左下,右上,左上,右下 是否被合并 是否被使用 int method[][]={{,},{,},{,},{,}}; //左下,右上,左上,右下
int Rectangles[]={,,-,-}; //大矩形 left,low,right,top
unsigned long long Area; //大矩形面积
unsigned long long Fact_Area=; //实际面积
int tmp[]; //用来获取角的位置 Hash_Init(s,Hashlen); for(i=;i<rectanglesRowSize;i++)
{
Fact_Area +=AREA(rectangles[i]);
for(j=;j<;j++)
{
if(j<) //计算left,low
{
if(Rectangles[j]>rectangles[i][j])
Rectangles[j]=rectangles[i][j];
}
else if(Rectangles[j]<rectangles[i][j]) //计算 right,top
Rectangles[j]=rectangles[i][j]; tmp[]=rectangles[i][method[j][]];
tmp[]=rectangles[i][method[j][]];
if(!Hash_search_insert(s,tmp[],tmp[],j+,&angle,Hashlen))
return false;
}
}
if(angle!=)
return false;
Area =AREA(Rectangles);
//printf("angle%d,Fact_Area%ld,Area%ld\n",angle,Fact_Area,Area);
if(Fact_Area==Area) //核对面积
return true;
else
     return false;
}



LeetCode-391. 完美矩形(使用C语言编译,详解)的更多相关文章

  1. Java实现 LeetCode 391 完美矩形

    391. 完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 ...

  2. Leetcode 391.完美矩形

    完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 [1,1 ...

  3. C语言001--hello world编译详解

    1.编写hello.c程序,并编译运行 book@100ask:~/linux/c01$ cat hello.c -n 1 #include <stdio.h> 2 3 int main( ...

  4. 2010_3_1最新 完整 FFMPEG 编译详解

    在网上看了很多编译详解,都很零散.经过自己的编译,解决一些BUG,在此分享自己的一些经验... 话不多说了!直接上贴. 第一步:准备编译平台. 需要 一个 MinGW 和 一个 MSYS 安装包 以及 ...

  5. Android 6.0 RK3288 ROM编译详解+命令详解【转】

    本文转载自:http://blog.csdn.net/MLQ8087/article/details/58607692 Android 6.0 RK3288 ROM编译详解+命令详解 原创 2017年 ...

  6. Android编译详解之lunch命令 【转】

    本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析     Android的优势就在于其开源,手机和 ...

  7. 深入理解C语言 - 指针详解

    一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...

  8. 02.PHP7.x编译详解

    #php7编译安装安装 ``` useradd -M -s /sbin/nologin www yum -y install openssl-devel bzip2-devel curl-devel ...

  9. 01.PHP5.x编译详解

    ##PHP5.5编译安装 ``` wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum i ...

随机推荐

  1. Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro

    1.错误描述 信息: MLog clients using java 1.4+ standard logging. 2014-7-12 19:29:20 com.mchange.v2.c3p0.C3P ...

  2. PCI-E配置MSI中断流程解析

    在传统的pci中断体系中,每一个pci总线上的设备被分配一个特定的中断号,然后当设备需要中断cpu时,设备直接发出int信号,然后在cpu的inta引脚拉低的时候将自己的中断号放在数据总线上,一切都要 ...

  3. 书籍--嵌入式C语言

    1,C语言嵌入式编程修炼 [C/C++]C语言嵌入式编程修炼·背景篇·软件架构篇·内存操作篇

  4. 【Uoj34】多项式乘法(NTT,FFT)

    [Uoj34]多项式乘法(NTT,FFT) 题面 uoj 题解 首先多项式乘法用\(FFT\)是一个很久很久以前就写过的东西 直接贴一下代码吧.. #include<iostream> # ...

  5. 【UVa11426】GCD - Extreme (II)(莫比乌斯反演)

    [UVa11426]GCD - Extreme (II)(莫比乌斯反演) 题面 Vjudge 题解 这.. 直接套路的莫比乌斯反演 我连式子都不想写了 默认推到这里把.. 然后把\(ans\)写一下 ...

  6. [UVAlive4297]First Knight

    题面在这里 题意 给定一个\(n\times m\)的格网,从\((1,1)\)出发,每一格\((i,j)\)往上下左右移动的概率已经给出,询问到达\((n,m)\)的期望步数 数据范围 \[n,m\ ...

  7. ZJOI2007仓库建设

    斜率优化 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <s ...

  8. python之hasattr()、 getattr() 、setattr() 函数

    这三个方法可以实现反射和内省机制,在实际项目中很常用,功能也很强大. [转]http://www.cnblogs.com/cenyu/p/5713686.html hasattr(object, na ...

  9. C语言引用另一个源文件中定义的数组

    C语言中是可以引用另外一个源文件的全局数组的,但是不能引用局部数组. 引用方式举例如下: 设a.c文件有有数据定义 int  array1[10]; 现有b.c文件中想访问a.c中的array1数组 ...

  10. MacOS中升级openssl

    MacOS中升级openssl   ➜  ~ brew instal openssl 使用情况中始终发现,openssl并没有真正升级   在/usr/local/Cellar/openssl/目录中 ...