鱼C论坛

 找回密码
 立即注册
查看: 1164|回复: 9

[已解决]小白求助 想求喷洒区域的大小的程序改怎么写

[复制链接]
匿名鱼油
匿名鱼油  发表于 2021-9-9 10:58:58 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想用无人机向旱情严重的某个农场喷水。 计划用无人机引爆水袋,向整个农场喷水。
图(a)标明了在指定的农场用水袋喷洒水的区域。 想了解一下这些撒播的领域有多大。
无人机投掷的水袋具有位置和水袋的宽度和高度。 像这样用水袋喷洒的区域中,A是900,B是600,C是1600。 如果把这些都加起来,那就是3100,但是除了B和C重叠的领域100之外,洒水的领域是3000。

[输入输出] 输入显示投掷的水袋的数量,第二行开始显示水袋的位置x,y 和h水袋的宽度w和高度h的信息
最佳答案
2021-9-10 00:07:27
  1. def overlap(A: list[tuple, int, int], B: list[tuple, int, int]):
  2.     width = 0
  3.     height = 0
  4.     a, b = (A[0][0]-A[1]/2, A[0][0]+A[1]/2), (B[0][0]-B[1]/2, B[0][0]+B[1]/2)
  5.     if a[0] < b[0] and a[1] > b[0]:
  6.         if a[1] > b[1]:
  7.             width = b[1]-b[0]
  8.         elif a[1] < b[1]:
  9.             width = a[1]-b[0]
  10.     elif b[0] < a[0] and b[1] > a[0]:
  11.         if b[1] > a[1]:
  12.             width = a[1]-a[0]
  13.         elif b[1] < a[1]:
  14.             width = b[1]-a[0]
  15.     a, b = (A[0][1]-A[2]/2, A[0][1]+A[2]/2), (B[0][1]-B[2]/2, B[0][1]+B[2]/2)
  16.     if a[0] < b[0] and a[1] > b[0]:
  17.         if a[1] > b[1]:
  18.             height = b[1]-b[0]
  19.         elif a[1] < b[1]:
  20.             height = a[1]-b[0]
  21.     elif b[0] < a[0] and b[1] > a[0]:
  22.         if b[1] > a[1]:
  23.             height = a[1]-a[0]
  24.         elif b[1] < a[1]:
  25.             height = b[1]-a[0]
  26.     return width*height

  27. def main():
  28.     N = int(input("輸入投擲水袋的數量:"))
  29.     area = []
  30.     for n in range(N):
  31.         x, y, w, h = map(int, input("水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):").split())
  32.         area.append([(x, y), w, h])
  33.     total = 0
  34.     res = 0
  35.     for i in range(N):
  36.         total += area[i][1]*area[i][2]
  37.         for j in range(i+1, N):
  38.             res += overlap(area[i], area[j])
  39.     print(f"灑水範圍:{total-res}")

  40. if __name__ == "__main__":
  41.     main()
复制代码
  1. 輸入投擲水袋的數量:3
  2. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):35 65 30 30
  3. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):75 35 30 20
  4. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):100 55 40 40
  5. 灑水範圍:3000.0
复制代码
屏幕截图 2021-09-09 110128.png
回复

使用道具 举报

发表于 2021-9-9 14:43:03 From FishC Mobile | 显示全部楼层
没有输入输出的例子吗,单看文字,看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2021-9-9 14:53:05
wp231957 发表于 2021-9-9 14:43
没有输入输出的例子吗,单看文字,看不懂

输入和输出的结果是这样的
屏幕截图 2021-09-09 155204.png
回复 支持 反对

使用道具 举报

发表于 2021-9-9 15:04:48 | 显示全部楼层
幫你整理範例中的輸入和輸出值吧,我也想學習:

題目
第一行:表示輸入顯示投擲的水袋的數量,
第二行開始:顯示水袋的位置 x,y 和水袋的寬度 w 和高度 h 的信息

示例輸入:
  1. 3
  2. 35 65 30 30
  3. 75 35 30 20
  4. 100 55 40 40
复制代码
輸出:
  1. 3000
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-9 18:15:47 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2021-9-9 15:04
幫你整理範例中的輸入和輸出值吧,我也想學習:

題目

要是n个矩形都相交,那这个题目难度嗖一下就完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2021-9-9 18:41:31
wp231957 发表于 2021-9-9 18:15
要是n个矩形都相交,那这个题目难度嗖一下就完了

请问就是这样输出的话该怎么写呀?
回复 支持 反对

使用道具 举报

发表于 2021-9-9 22:57:38 | 显示全部楼层
匿名者 发表于 2021-9-9 18:41
请问就是这样输出的话该怎么写呀?

关键是有超过 3 个矩形有公共部分的话,面积怎么算?
下面是 3 个的情况,如果是 4 个,5 个,6 个,。。。
这样面积要怎么算?
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-10 00:07:27 | 显示全部楼层    本楼为最佳答案   
  1. def overlap(A: list[tuple, int, int], B: list[tuple, int, int]):
  2.     width = 0
  3.     height = 0
  4.     a, b = (A[0][0]-A[1]/2, A[0][0]+A[1]/2), (B[0][0]-B[1]/2, B[0][0]+B[1]/2)
  5.     if a[0] < b[0] and a[1] > b[0]:
  6.         if a[1] > b[1]:
  7.             width = b[1]-b[0]
  8.         elif a[1] < b[1]:
  9.             width = a[1]-b[0]
  10.     elif b[0] < a[0] and b[1] > a[0]:
  11.         if b[1] > a[1]:
  12.             width = a[1]-a[0]
  13.         elif b[1] < a[1]:
  14.             width = b[1]-a[0]
  15.     a, b = (A[0][1]-A[2]/2, A[0][1]+A[2]/2), (B[0][1]-B[2]/2, B[0][1]+B[2]/2)
  16.     if a[0] < b[0] and a[1] > b[0]:
  17.         if a[1] > b[1]:
  18.             height = b[1]-b[0]
  19.         elif a[1] < b[1]:
  20.             height = a[1]-b[0]
  21.     elif b[0] < a[0] and b[1] > a[0]:
  22.         if b[1] > a[1]:
  23.             height = a[1]-a[0]
  24.         elif b[1] < a[1]:
  25.             height = b[1]-a[0]
  26.     return width*height

  27. def main():
  28.     N = int(input("輸入投擲水袋的數量:"))
  29.     area = []
  30.     for n in range(N):
  31.         x, y, w, h = map(int, input("水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):").split())
  32.         area.append([(x, y), w, h])
  33.     total = 0
  34.     res = 0
  35.     for i in range(N):
  36.         total += area[i][1]*area[i][2]
  37.         for j in range(i+1, N):
  38.             res += overlap(area[i], area[j])
  39.     print(f"灑水範圍:{total-res}")

  40. if __name__ == "__main__":
  41.     main()
复制代码
  1. 輸入投擲水袋的數量:3
  2. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):35 65 30 30
  3. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):75 35 30 20
  4. 水袋位置 x y,噴灑寬度 w,和高度 h(以空格隔開輸入):100 55 40 40
  5. 灑水範圍:3000.0
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-10 00:13:09 | 显示全部楼层
既然不好算,那就不算了,面积为什么非的是 长 x 宽

  1. import numpy as np

  2. class box_t:
  3.     def __init__(self, width, height):
  4.         self.width = width
  5.         self.height = height
  6.         self.data = np.zeros((self.height, self.width))
  7.     def set_rect(self, x, y, width, height):
  8.         for i in range(height):
  9.             for j in range(width):
  10.                 self.data[y + i][x + j] = 1
  11.     def get_area(self):
  12.         area = 0
  13.         for y in range(self.height):
  14.             for x in range(self.width):
  15.                 area += self.data[y][x]
  16.         return int(area)

  17. box = box_t(130, 100)
  18. count = int(input())
  19. for _ in range(count):
  20.     x, y, w, h = map(int, input().split())
  21.     x = int(x - (w / 2))
  22.     y = int(y - (h / 2))
  23.     box.set_rect(x, y, w, h)
  24. print(box.get_area())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-10 00:27:39 | 显示全部楼层
其實問題不難,難是解答代碼麻煩,我想說看看別人怎麼寫,再從中偷學技術/技巧,哪知沒有人寫,所以手癢癢花了十分鐘寫完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-15 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表