#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[][8],int len)
{
for(int i=0;i<len;i++)
{
Hash[i][7]=0;
}
}
//首先查找表,如果存在,则检查该角度是否被重叠,如果不存在,则插入表
bool Hash_search_insert(int Hash[][8],int x,int y,int angle,int *angles,int len)
{
int addr=Index(x,y,len); //求哈希地址
int tmp=addr;
//查找
while(Hash[addr][7]==1)
{
if(Hash[addr][0]==x&&Hash[addr][1]==y) //已找到
{
if(Hash[addr][angle]==0) //未重叠
{
if(Hash[addr][6]==0) // 是否 合并 过
{
Hash[addr][6]=1;
(*angles)--;
}
Hash[addr][angle]=1; //设为占用
return true;
}
else //已重叠
return false;
}
addr =(addr+1)% len;
if(addr==tmp) //未找到
return false;
}
//Hash[addr][7]等于0,说明没找到,则插入表
Hash[addr][7]=1;
Hash[addr][0]=x;
Hash[addr][1]=y;
Hash[addr][6]=0; //未合并过
(*angles)++;
for(int i=2;i<6;i++) //左下,右上,左上,右下
if(i==angle)
Hash[addr][i]=1;
else
Hash[addr][i]=0;
return true;
}
bool isRectangleCover(int** rectangles, int rectanglesRowSize, int rectanglesColSize)
{
int i,j,k,angle=0,cnt=0;
int Hashlen=rectanglesRowSize*8;
int s[Hashlen][8]; // x y 左下,右上,左上,右下 是否被合并 是否被使用
int method[4][2]={{0,1},{2,3},{0,3},{2,1}}; //左下,右上,左上,右下
int Rectangles[4]={999999,999999,-999999,-9999999}; //大矩形 left,low,right,top
unsigned long long Area; //大矩形面积
unsigned long long Fact_Area=0; //实际面积
int tmp[2]; //用来获取角的位置
Hash_Init(s,Hashlen);
for(i=0;i<rectanglesRowSize;i++)
{
Fact_Area +=AREA(rectangles[i]);
for(j=0;j<4;j++)
{
if(j<2) //计算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[0]=rectangles[i][method[j][0]];
tmp[1]=rectangles[i][method[j][1]];
if(!Hash_search_insert(s,tmp[0],tmp[1],j+2,&angle,Hashlen))
return false;
}
}
if(angle!=4)
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;
}
文章来源:https://www.cnblogs.com/lifexy/p/8683020.html