用 Python 编写程序,根据有色顶点正多边形计算等腰三角形的数量

pythonserver side programmingprogramming更新于 2025/12/18 18:20:17

假设我们有一个正多边形,其边数为 n,表示为大小为 n 的二进制字符串。顶点可以涂成蓝色 (0) 或红色 (1)。它们按顺时针方向着色 我们必须计算等腰三角形的数量,这些三角形的顶点是正多边形的顶点,并且它们的颜色相同。

因此,如果输入为诸如polygon = "111010",则输出将为 2,因为

有两个三角形 ACE 和 AFE。

为了解决这个问题,我们将遵循以下步骤 −

  • 定义一个函数 all() 。这将需要 n
  • 如果 n mod 2 与 1 相同,则 no := n*(n-1) /2
  • 否则,no := n*(n/2-1)
  • 如果 n mod 3 与 0 相同,则 no := no - n/3*2
  • 返回 no
  • 定义一个函数 non() 。这将需要 a,n
  • 如果 n mod 2 与 1 相同,则
    • s0 := 0, s1 := 0
    • i := 0
    • while i < n,执行
      • 如果 a[i] 与 '0' 相同,则 s0 := s0 + 1
      • 否则 s1 := s1 + 1
      • i := i + 1
    • s := s0*s1*6
    • 如果 n mod 3 与 0 相同,则
      • n1 := n/3
      • n2 := n1*2
      • i := 0
      • 当 i < n,执行
        • 如果 a[i] 与 a[(i+n1)mod n] 不同,则
          • s := s - 2
        • 如果 a[i] 与 a[(i+n2)mod n] 不同,则
          • s := s - 2
        • i := i + 1
  • 否则,
    • s00 := 0, s01 := 0, s10 := 0, s11 := 0, s := 0
    • i := 0
    • 当 i < n 时,执行
      • 如果 a[i] 与 '0' 相同,则 s00 := s00 + 1
      • 否则 s01 := s01 + 1
      • i := i + 2
    • i := 1
    • 当 i < n,执行
      • 如果 a[i] 与 '0' 相同,则 s10 := s10 + 1
      • 否则 s11 := s11 + 1
      • i := i + 2
    • s := s + s00 * s01 * 8
    • s := s + s10 * s11 * 8
    • s := s + s00 * s11 * 4
    • s := s + s10 * s01 * 4
    • n1 := n/2
    • i := 0
    • 当 i < n,执行
      • 如果 a[i] 与 a[(i + n1)mod n] 不同,则
        • s := s - 2
      • i := i + 1
    • 如果 n mod 3 与 0 相同,则
      • n1 := n/3
      • n2 := n1*2
      • i := 0
      • 当 i < n,执行
        • 如果 a[i] 与 a[(i+n1)mod n] 不同,则
          • s := s - 2
        • 如果 a[i] 与 a[(i+n2)mod n] 不同,则
          • s := s - 2
        • i := i + 1
  • 返回 s/2
  • 从主方法中,执行以下操作 −
  • n := 多边形的大小
  • no := all(n) - non(polygon, n) /2
  • 返回 no

示例

让我们看看下面的实现以便更好地理解 −

def all(n):
   if n % 2 == 1:
      no = n*(n-1)/2
   else:
      no = n*(n/2-1)
   if n % 3 == 0:
      no -= n/3*2
   return no

def non(a,n):
   if n % 2 == 1:
      s0 = s1 = 0
      i = 0
      while i < n:
         if a[i] == '0':
            s0 += 1
         else:
            s1 += 1
         i += 1
      s = s0*s1*6
      if n % 3 == 0:
         n1 = n/3
         n2 = n1*2
         i = 0
         while i<n:
            if a[i] != a[int((i+n1)%n)]:
               s -= 2
            if a[i] != a[int((i+n2)%n)]:
               s -= 2
            i += 1
   else:
      s00 = s01 = s10 = s11 = s = 0
      i = 0
      while i <n:
         if a[i] == '0':
            s00 += 1
         else:
            s01 += 1
         i += 2
      i = 1
      while i < n:
         if a[i] == '0':
            s10 += 1
         else:
            s11 += 1
         i += 2
      s += s00 * s01 * 8
      s += s10 * s11 * 8
      s += s00 * s11 * 4
      s += s10 * s01 * 4
      n1 = n/2
      i = 0
      while i < n:
         if a[i] != a[int((i + n1)%n)]:
            s -= 2
         i += 1
      if n % 3 == 0:
         n1 = n/3
         n2 = n1*2
         i = 0
         while i < n:
            if a[i] != a[int((i+n1)%n)]:
               s -= 2
            if a[i] != a[int((i+n2)%n)]:
               s -= 2
            i += 1
   return s/2

def solve(polygon):
   n = len(polygon)
   no = all(n) - non(polygon,n)/2
   return int(no)

polygon = "111010"
print(solve(polygon))

输入

1, 1000

输出

2

相关文章


有用资源