求四边形的数量

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值