求四边形的数量

首先,什么样的是四边形?

1.四个点

2.第一个点与第二个点相连,第二个点与第三个点相连,第三个点与第四个点相连,第四个点与第一个点相连

3.任意三个点不在一条直线上

4.第二个和第四个点在第一、三两点所成直线的两边
python代码如下:

#-*-coding:utf8;-*-

#qpy:3

#qpy:console
#point define

class Point():

  def __init__(self, row, col):

    self.Row = row

    self.Col = col
#check if two points are linked

def checklinked(p1, p2):

  if(p1.Row == p2.Row):

    return True

  if(p1.Col == p2.Col):

    return True

  if(p2.Row-p1.Row == p2.Col-p1.Col):

    return True

  return False
#check if three points are on a line

def checkline(p1, p2, p3):

  if((p1.Row == p2.Row) & (p1.Row == p3.Row)):

    return True

  if((p1.Col == p2.Col) & (p1.Col == p3.Col)):

    return True

  if((p2.Row-p1.Row == p2.Col-p1.Col) & (p3.Row-p1.Row == p3.Col-p1.Col)):

    return True

  return False
#check four points can be a 4

def checkcross(p1, p2, p3,p4):

  if(p3.Col == p1.Col):

    if(((p4.Col-p1.Col)*(p2.Col-p1.Col)) <0):

      return True

    else:

      return False

  k=(p3.Row-p1.Row)/(p3.Col-p1.Col)

  b=(p3.Col*p1.Row-p1.Col*p3.Row)/(p3.Col-p1.Col)

  if((k*p2.Col+b-p2.Row)*(k*p4.Col+b-p4.Row) <0):

    return True

  else:

    return False

    

#check four points can be a 4

def check4(p1, p2, p3,p4):

  if(checklinked(p1, p2)):

    if(checklinked(p2, p3)):

      if(checklinked(p3, p4)):

        if(checklinked(p4, p1)):

          if(checkline(p1, p2, p3)):

          	 return False

          if(checkline(p1, p2, p4)):

          	 return False

          if(checkline(p1, p4, p3)):

            return False

          if(checkline(p4, p2, p3)):

          	 return False

          if(checkcross(p1, p2, p3, p4)):

            return True

          else:

            return False

  return False

  
def calc4(N):

  count = 0

  NN= N*N

  lst = list()

  for i in range(0, N):

    for j in range(0, N):

      p = Point(i, j)

      lst.append(p)

  for n1 in range(0, NN):

    for n2 in range(1, NN):

      for n3 in range(1, NN):

        for n4 in range(1, NN):

          if((n1+n2+n3+n4) >(NN-1)):

            continue

          p1 = lst[n1]

          p2 = lst[n1+n2]

          p3 = lst[n1+n2+n3]

          p4 = lst[n1+n2+n3+n4]

          if(check4(p1,p2,p3,p4)):

            count += 1

          if(check4(p1,p2,p4,p3)):

            count += 1

  return count

  

print(“result:”)

print(calc4(8))

 

转载于:https://my.oschina.net/raygo/blog/778205

### 数据结构中平行四边形数量计算 在涉及几何形状识别和计数的问题时,通常会遇到复杂的组合问题。对于给定的一组点集,要找出其中能构成平行四边形的数目,可以采用特定的数据结构和技术来优化解过程。 为了高效地解决问题,一种有效的方法是利用哈希表存储中间结果[^5]。具体来说: - 对于每一对不同的点 \( (A, B) \),计算这两点形成的向量,并将其保存到哈希表中。 - 如果另一个点对 \( (C, D) \) 形成相同的向量,则意味着这四个点可能构成了一个平行四边形。 - 需要注意的是,还需验证这些点确实形成闭合路径,即满足 \( A + CD = C + AB \)[^2]。 这种方法能够显著减少重复计算并提高效率。以下是简化版的伪代码实现方式: ```c++ unordered_map<string, vector<pair<int,int>>> midpoints; // 存储中点及其对应的点对 for each pair of points P1 and P2 { Point midpoint = calculateMidpoint(P1, P2); string key = serialize(midpoint.x, midpoint.y); // 将坐标转换为字符串形式作为键值 if (!midpoints.contains(key)) midpoints[key].push_back({P1.id, P2.id}); } // 统计符合条件的平行四边形数量 int count = 0; for auto& entry : midpoints { int size = entry.second.size(); count += combination(size, 2); // 计算从size个元素里选两个的不同组合数 } ``` 此算法的时间复杂度取决于输入点的数量 n 和最终找到的潜在平行四边形候选者的数量 m 。理想情况下,该方法可以在 O(n²) 时间内完成预处理阶段,在最坏的情况下(当所有点都位于同一直线上),则需要额外花费 O(m²) 来枚举所有的可能性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值