Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm đường đi một đường liên tục trong một khu vực hình chữ nhật mà không cần đặt bom bằng Python

Giả sử chúng ta được cung cấp một mat mảng trong đó các phần tử có dạng [p, q, r] trong đó p, q là tọa độ hình học và r là giá trị bán kính. Các mục trong mảng là vị trí của các quả bom trong một khu vực hình chữ nhật có chiều rộng w cho trước. Hình chữ nhật dài vô hạn và được giới hạn bởi x tọa độ x =0 đến x =w. Giá trị r ở vị trí đặt bom biểu thị bán kính an toàn của bom, có nghĩa là bất kỳ thứ gì nhỏ hơn bán kính đó của bom sẽ tác động vào nó. Vì vậy, những gì chúng ta phải làm là vẽ một con đường liên tục bắt đầu bên dưới mỗi quả bom và kết thúc phía trên mỗi quả bom mà không tham gia vào bất kỳ quả nào trong số chúng. Chúng tôi sẽ in True nếu chúng tôi có thể vẽ đường này, nếu không, chúng tôi sẽ in False.

Vì vậy, nếu đầu vào giống như mat =

0 1 2
3 2 1
2 1 1

, w =4; thì đầu ra sẽ là False.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm insu (). Điều này sẽ mất p, q
    • x1:=p [1], x2:=p [2]
    • y2:=q [1], y4:=q [2]
    • r1:=p [3], r2:=q [3]
    • d:=(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)
    • dec:=(r1 + r2) * (r1 + r2)
    • trả về True nếu d <=dec, nếu không trả về False
  • sắp xếp ma trận dựa trên các giá trị tọa độ x
  • temp:=một danh sách mới
  • nếu mat [0] [0] - mat [0] [2]> 0, thì
    • trả về True
  • cho mỗi p, q, r trong mat, do
    • min_wid:=p - r
    • max_wid:=p + r
    • nếu kích thước của nhiệt độ bằng 0, thì
      • thêm danh sách chứa (p + r, p, q, r, p - r, p + r) vào cuối tạm thời
    • nếu không,
      • mx:=Maximum of (vị trí tạm thời trong đó danh sách [p - r, -p, q, r, 0, 0] có thể được chèn theo thứ tự đã sắp xếp - 1), 0
      • in_list:=một danh sách mới chứa các phần tử (p + r, p, q, r, p - r, p + r)
      • đối với tôi trong phạm vi mx đến kích thước của nhiệt độ, thực hiện
        • nếu không bảo mật (tạm thời [i], in_list) là Đúng, thì
          • max_wid =tối đa trong tổng số (max_wid, temp [i, -1])
        • min_wid =tối thiểu là (min_wid, temp [i, -2])
      • phần tử cuối cùng thứ hai của in_list:=min_wid
      • last_element của in_list:=max_wid
      • chèn in_list để duy trì tạm thời thứ tự đã sắp xếp
    • nếu min_wid <=0 và max_wid> =w, thì
      • trả về Sai
  • trả về True

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

 từ bisect nhập bisect_left, insortdef giải (mat, w):mat.sort (key =lambda i:i [0] - i [2]) temp =[] if mat [0] [0] - mat [ 0] [2]> 0:trả về True cho p, q, r trong mat:min_wid, max_wid =p - r, p + r if len (temp) ==0:temp.append ([p + r, p, q, r, p - r, p + r]) else:mx =max (bisect_left (temp, [p - r, -p, q, r, 0, 0]) - 1, 0) in_list =[p + r, p, q, r, p - r, p + r] for i in range (mx, len (temp)):if ins (temp [i], in_list):max_wid =max (max_wid, temp [i] [-1]) min_wid =min (min_wid, temp [i] [- 2]) in_list [-2] =min_wid in_list [-1] =max_wid insort (temp, in_list) if min_wid <=0 and max_wid> =w :return False return Truedef ins (p, q):x1, y1, x2, y2 =p [1], p [2], q [1], q [2] r1, r2 =p [3], q [ 3] d =(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) dec =(r1 + r2) * (r1 + r2) trả về d <=decprint (giải ([[ 0, 1, 2], [3, 2, 1], [2, 1, 1]], 4))  

Đầu vào

 [[0, 1, 2], [3, 2, 1], [2, 1, 1]], 4 

Đầu ra

 Sai