พิจารณารูปหลายเหลี่ยมตัดกันตนเองที่อาจกำหนดโดยรายการจุดยอดในพื้นที่ 2D เช่น
{{0, 0}, {5, 0}, {5, 4}, {1, 4}, {1, 2}, {3, 2}, {3, 3}, {2, 3}, {2, 1}, {4, 1}, {4, 5}, {0, 5}}
มีหลายวิธีในการกำหนดพื้นที่ของรูปหลายเหลี่ยมดังกล่าว แต่สิ่งที่น่าสนใจที่สุดคือกฎที่เป็นคู่ จับจุดใด ๆ บนระนาบลากเส้นจากจุดที่ชี้ไปยังระยะอนันต์ หากบรรทัดนั้นข้ามรูปหลายเหลี่ยมด้วยจำนวนคี่จุดจะเป็นส่วนหนึ่งของพื้นที่ของรูปหลายเหลี่ยมถ้าข้ามรูปหลายเหลี่ยมเป็นจำนวนเท่าตัวจุดนั้นจะไม่เป็นส่วนหนึ่งของรูปหลายเหลี่ยม สำหรับตัวอย่างรูปหลายเหลี่ยมด้านบนนี่คือทั้งโครงร่างและพื้นที่คู่ของมัน:
รูปหลายเหลี่ยมโดยทั่วไปจะไม่เป็นมุมฉาก ฉันเลือกตัวอย่างง่ายๆเช่นนี้เพื่อให้นับพื้นที่ได้ง่ายขึ้น
พื้นที่ของตัวอย่างนี้คือ17
(ไม่ใช่24
หรือ33
เป็นคำจำกัดความอื่นหรือพื้นที่อาจให้ผลผลิต)
โปรดทราบว่าภายใต้ข้อกำหนดนี้พื้นที่ของรูปหลายเหลี่ยมนั้นไม่ขึ้นอยู่กับลำดับการพัน
ความท้าทาย
รับรายการของจุดยอดที่มีพิกัดจำนวนเต็มกำหนดรูปหลายเหลี่ยมกำหนดพื้นที่ของมันภายใต้กฎคู่ที่คี่
คุณสามารถเขียนฟังก์ชันหรือโปรแกรมรับอินพุตผ่าน STDIN หรือทางเลือกอื่นใกล้เคียงอาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันแล้วส่งคืนผลลัพธ์หรือพิมพ์ไปที่ STDOUT หรือทางเลือกที่ใกล้เคียงที่สุด
คุณสามารถป้อนข้อมูลในรูปแบบรายการหรือรูปแบบสตริงใด ๆ ก็ได้หากยังไม่ได้ทำการประมวลผลล่วงหน้า
ผลลัพธ์ควรเป็นเลขทศนิยมอย่างถูกต้องถึง 6 หลัก (ทศนิยม) ที่มีนัยสำคัญหรือผลลัพธ์ที่มีเหตุผลซึ่งการแสดงจุดลอยตัวนั้นถูกต้องถึง 6 ตัวเลขที่สำคัญ (หากคุณให้ผลลัพธ์ที่สมเหตุสมผลพวกเขาน่าจะถูกต้อง แต่ฉันไม่สามารถทำได้เพราะฉันไม่มีผลลัพธ์ที่แน่นอนสำหรับการอ้างอิง)
คุณจะต้องสามารถแก้ปัญหากรณีทดสอบด้านล่างนี้ภายใน 10 วินาทีด้วยเครื่องเดสก์ท็อปที่เหมาะสม (มีกฎบางข้อในระยะนี้ดังนั้นให้ใช้วิจารณญาณที่ดีที่สุดของคุณหากใช้เวลา 20 วินาทีบนแล็ปท็อปของฉันฉันจะให้คุณได้รับข้อสงสัยถ้าใช้เวลาสักครู่ฉันจะไม่) ฉันคิดว่าข้อ จำกัด นี้ ควรเป็นคนใจกว้างมาก แต่ก็ควรที่จะตัดทอนวิธีการที่คุณเพียงแค่แยกรูปหลายเหลี่ยมบนกริดและการนับที่ดีพอหรือใช้แนวทางความน่าจะเป็นเช่น Monte Carlo เป็นนักกีฬาที่ดีและอย่าพยายามเพิ่มประสิทธิภาพของวิธีการเหล่านี้เพื่อให้คุณสามารถทำตามเวลาที่กำหนดได้ ;)
คุณต้องไม่ใช้ฟังก์ชั่นที่มีอยู่ที่เกี่ยวข้องโดยตรงกับรูปหลายเหลี่ยม
นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ
สมมติฐาน
- พิกัดทั้งหมดเป็นจำนวนเต็มในช่วง
0 ≤ x ≤ 100
,0 ≤ y ≤ 100
. - จะมีจุดสูงสุดอย่างน้อย
3
ที่สุด50
- จะไม่มีจุดยอดซ้ำ ๆ จุดยอดใดจะไม่อยู่บนขอบอีกด้านหนึ่ง ( อาจมีจุด collinear ในรายการ)
กรณีทดสอบ
{{0, 0}, {5, 0}, {5, 4}, {1, 4}, {1, 2}, {3, 2}, {3, 3}, {2, 3}, {2, 1}, {4, 1}, {4, 5}, {0, 5}}
17.0000
{{22, 87}, {6, 3}, {98, 77}, {20, 56}, {96, 52}, {79, 34}, {46, 78}, {52, 73}, {81, 85}, {90, 43}}
2788.39
{{90, 43}, {81, 85}, {52, 73}, {46, 78}, {79, 34}, {96, 52}, {20, 56}, {98, 77}, {6, 3}, {22, 87}}
2788.39
{{70, 33}, {53, 89}, {76, 35}, {14, 56}, {14, 47}, {59, 49}, {12, 32}, {22, 66}, {85, 2}, {2, 81},
{61, 39}, {1, 49}, {91, 62}, {67, 7}, {19, 55}, {47, 44}, {8, 24}, {46, 18}, {63, 64}, {23, 30}}
2037.98
{{42, 65}, {14, 59}, {97, 10}, {13, 1}, {2, 8}, {88, 80}, {24, 36}, {95, 94}, {18, 9}, {66, 64},
{91, 5}, {99, 25}, {6, 66}, {48, 55}, {83, 54}, {15, 65}, {10, 60}, {35, 86}, {44, 19}, {48, 43},
{47, 86}, {29, 5}, {15, 45}, {75, 41}, {9, 9}, {23, 100}, {22, 82}, {34, 21}, {7, 34}, {54, 83}}
3382.46
{{68, 35}, {43, 63}, {66, 98}, {60, 56}, {57, 44}, {90, 52}, {36, 26}, {23, 55}, {66, 1}, {25, 6},
{84, 65}, {38, 16}, {47, 31}, {44, 90}, {2, 30}, {87, 40}, {19, 51}, {75, 5}, {31, 94}, {85, 56},
{95, 81}, {79, 80}, {82, 45}, {95, 10}, {27, 15}, {18, 70}, {24, 6}, {12, 73}, {10, 31}, {4, 29},
{79, 93}, {45, 85}, {12, 10}, {89, 70}, {46, 5}, {56, 67}, {58, 59}, {92, 19}, {83, 49}, {22,77}}
3337.62
{{15, 22}, {71, 65}, {12, 35}, {30, 92}, {12, 92}, {97, 31}, {4, 32}, {39, 43}, {11, 40},
{20, 15}, {71, 100}, {84, 76}, {51, 98}, {35, 94}, {46, 54}, {89, 49}, {28, 35}, {65, 42},
{31, 41}, {48, 34}, {57, 46}, {14, 20}, {45, 28}, {82, 65}, {88, 78}, {55, 30}, {30, 27},
{26, 47}, {51, 93}, {9, 95}, {56, 82}, {86, 56}, {46, 28}, {62, 70}, {98, 10}, {3, 39},
{11, 34}, {17, 64}, {36, 42}, {52, 100}, {38, 11}, {83, 14}, {5, 17}, {72, 70}, {3, 97},
{8, 94}, {64, 60}, {47, 25}, {99, 26}, {99, 69}}
3514.46
upath
และlineto
ฟังดูเหมือนว่าคุณกำลังประมวลผลอินพุตล่วงหน้า คือคุณไม่ได้รับรายการพิกัด แต่เป็นรูปหลายเหลี่ยมจริง
CrossingPolygon
มีการสร้างขึ้นใหม่ในฟังก์ชั่นสำหรับการนี้:
upath
ตัวดำเนินการเดียว (อันที่จริงแล้วเป็นการแปลง 1: 1 ที่ง่ายมากระหว่าง seperators}, {
เพิ่งจะกลายเป็นlineto
และเครื่องหมายจุลภาคระหว่าง x และ y ถูกลบออกและวงเล็บปีกกาเปิดและปิดจะถูกแทนที่ด้วยส่วนหัวและส่วนท้ายแบบคงที่ ... )