LeetCode-391. 完美矩形(使用C语言编译,详解)
链接: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语言编译,详解)的更多相关文章
- Java实现 LeetCode 391 完美矩形
391. 完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 ...
- Leetcode 391.完美矩形
完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 [1,1 ...
- C语言001--hello world编译详解
1.编写hello.c程序,并编译运行 book@100ask:~/linux/c01$ cat hello.c -n 1 #include <stdio.h> 2 3 int main( ...
- 2010_3_1最新 完整 FFMPEG 编译详解
在网上看了很多编译详解,都很零散.经过自己的编译,解决一些BUG,在此分享自己的一些经验... 话不多说了!直接上贴. 第一步:准备编译平台. 需要 一个 MinGW 和 一个 MSYS 安装包 以及 ...
- Android 6.0 RK3288 ROM编译详解+命令详解【转】
本文转载自:http://blog.csdn.net/MLQ8087/article/details/58607692 Android 6.0 RK3288 ROM编译详解+命令详解 原创 2017年 ...
- Android编译详解之lunch命令 【转】
本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和 ...
- 深入理解C语言 - 指针详解
一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...
- 02.PHP7.x编译详解
#php7编译安装安装 ``` useradd -M -s /sbin/nologin www yum -y install openssl-devel bzip2-devel curl-devel ...
- 01.PHP5.x编译详解
##PHP5.5编译安装 ``` wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum i ...
随机推荐
- C# GUID介绍和的使用
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- hibernate学习(四)hibernate的一级缓存&快照
缓存:提高效率 硬件的 CPU缓存 硬盘缓存 内存 软件的 io流缓存 hibernate 的一级缓存 也是为了操作数据库的效率. 证明一级缓存在 : Person p=sessio ...
- LeetCode 542. 01 Matrix
输入:只包含0,1的矩阵 输出:元素1到达最近0的距离 算法思想:广度优先搜索. 元素为0为可达区域,元素为1为不可达区域,我们的目标是为了从可达区域不断地扩展至不可达区域,在扩展的过程中,也就计算出 ...
- java的System.getProperty()获取的值
public class SystemProperty { public static void main(String args[]) { System.out.println("java ...
- WPF基础篇之资源文件路径
WPF资源文件的路径 关于WPF资源文件的路径 这几天在WPF中调用资源文件的Uri时,因为是在代码里调用Uri写的Uri总是不对,要么运行直接报异常,要么说找不到资源文件.下面是我解决的整个经过和碰 ...
- 让你的微信小程序具有在线支付功能
前言 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过 ...
- Windows系统还原失败心得
最近我的Windows10连续几天出现了蓝屏,怀疑是某软件的Bug造成的,于是想用系统还原功能回到前一段时间,我找到了那款软件安装的时间. 到了选择还原点界面,发现有5个还原点,最旧的一个刚好就是那款 ...
- 对于Hibernate和MyBatis的区别与利弊,谈谈你的看法
Hibernate与MyBatis的对比: 1.MyBatis非常简单易学,与Hibernate相对复杂,门槛较高: 2.两者都是比较优秀的开源产品: 3.当系统属于二次开发,无法对于数据库结构做到控 ...
- CF908G Original Order
题目大意: 定义\(R(x) = 每个数在各数位排序后得到的数\) 例如:\(R(321597) = 123579\) 给定一个\(n<=10^{700}\),求\(\sum _{i=1}^n ...
- [BZOJ1041] [HAOI2008] 圆上的整点 (数学)
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...