Xác định xem một đa giác có lồi không


21

Viết chương trình để xác định xem đa giác đầu vào có lồi không . Đa giác được chỉ định với một dòng chứa N , số lượng đỉnh, sau đó N dòng chứa tọa độ xy của mỗi đỉnh. Các đỉnh sẽ được liệt kê theo chiều kim đồng hồ bắt đầu từ một đỉnh tùy ý.

ví dụ 1

đầu vào

4
0 0
0 1
1 1
1 0

đầu ra

convex

ví dụ 2

đầu vào

4
0 0
2 1
1 0
2 -1

đầu ra

concave

ví dụ 3

đầu vào

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

đầu ra

convex

xy là các số nguyên, N <1000| x |, | y | <1000 . Bạn có thể giả sử rằng đa giác đầu vào là đơn giản (không có cạnh nào chéo, chỉ có 2 cạnh chạm vào mỗi đỉnh). Chương trình ngắn nhất sẽ thắng.


"Đơn giản" không bao gồm "các cạnh liên tiếp là không cộng tuyến"?! Ngoài ra, một vài trường hợp thử nghiệm nữa: (0,0) (0,2) (2,2) (2,0) (1,1); và (1,1) (0,0) (0,2) (2,2) (2,0) - để kiểm tra các trường hợp trong đó việc tìm đỉnh lõm đòi hỏi phải quấn từ đầu trở lại bắt đầu.
Peter Taylor

Câu hỏi này đã cũ, nhưng ... Hãy xem xét thêm một ví dụ lõm với hai phân đoạn được căn chỉnh, ví dụ: sửa đổi ví dụ 2: (0,0), (2.1), (4.2), (1.0) ( 2, -1). Tôi đưa ra điều này bởi vì tôi làm mờ xung quanh ví dụ 3 mà không nhận ra nó.
Jesse Millikan

Câu trả lời:


4

J, 105

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

Vượt qua cả ba bài kiểm tra trên.

Chỉnh sửa: (111-> 115) Xử lý các điểm đồng tuyến bằng cách loại bỏ các góc của pi. Đạt được một vài nhân vật ở nơi khác.

Chỉnh sửa: (115-> 105) Ít câm.

Giải thích cho người khuyết tật J:

  • (1!:1)3đọc STDIN để EOF. (Tôi nghĩ.)
  • 0&".;._2 là một thành ngữ hay để phân tích kiểu đầu vào này.
  • j./"1}. tắt dòng đầu tiên (N 0) và chuyển đổi cặp thành phức.
  • (,2&{.) Tack hai điểm đầu tiên vào cuối danh sách.
  • 3(f)\ áp dụng f cho cửa sổ trượt có độ dài 3 (3 điểm cho một góc)
  • [:-/12 o.-@-/@}.,-/@}: là một động từ biến đổi 3 điểm thành một góc giữa -pi và pi.
    • -@-/@}.,-/@}:tạo ra (p1 - p2), (p3 - p2). (Nhớ lại rằng đây là những phức tạp.)
    • 12 o. đưa ra một góc cho mỗi phức tạp.
    • [:-/(...) cho sự khác biệt của hai góc độ.
  • (o.1)([:>-.~)(o.2)| mod 2 pi, loại bỏ các góc của pi (các đoạn thẳng) và so sánh với pi (lớn hơn, nhỏ hơn, không quan trọng trừ khi các điểm được cho là bị thương theo một hướng).
  • 1=#= nếu tất cả những kết quả so sánh 1 hoặc 0 (Với việc tự phân loại. Điều này có vẻ ngu ngốc.)
  • echo>('concave';'convex'){~ in lồi.

3

Python - 149 ký tự

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

Tôi nghĩ bạn cần <=, xem ví dụ 3 tôi vừa thêm.
Keith Randall

1
chết tiệt, lát đó ...
st0le

2

Ruby 1.9, 147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

scala: 297 ký tự

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
Bạn có thể cạo ba ký tự bằng cách sử dụng def main(a:...thay vì def main(args:....
Gareth

Vâng, tôi nhận thấy bản thân mình, nhưng từ 299 đến 149 không đưa tôi đến khu vực của người khác. Có lẽ nếu tôi tìm thấy những cải tiến khác - à, có một: n là tên hàm (tiếp theo) và tên biến.
người dùng không xác định
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.