วาดรูปสามเหลี่ยม Sierpinski ได้รับการ ทำเพื่อ ความตาย มีสิ่งที่น่าสนใจอื่น ๆ ที่เราสามารถทำได้ หากเราเหลื่อมอย่างหนักที่สามเหลี่ยมเราสามารถดูรูปสามเหลี่ยมกลับหัวกลับหางเป็นโหนดของกราฟเศษส่วน ลองหาวิธีของเรารอบกราฟนั้น!
ก่อนอื่นเรามากำหนดหมายเลขให้แต่ละโหนด รูปสามเหลี่ยมคว่ำที่ใหญ่ที่สุดจะเป็นศูนย์โหนดและจากนั้นเราก็ลงเลเยอร์ทีละเลเยอร์
คลิกเพื่อดูเวอร์ชั่นที่ใหญ่ขึ้นซึ่งตัวเลขขนาดเล็กจะเบลอน้อยลง
(แน่นอนรูปแบบนี้ยังคงไม่มีที่สิ้นสุดภายในรูปสามเหลี่ยมสีฟ้า.) วิธีการกำหนดเลขก็คือว่าโหนดกลางมีดัชนี0
และเด็กของโหนดi
(รูปสามเหลี่ยมที่อยู่ติดกันของระดับถัดไปที่มีขนาดเล็ก) มีดัชนี3i+1
, และ3i+2
3i+3
เราจะย้ายกราฟนี้อย่างไร มีขั้นตอนตามธรรมชาติได้ถึงหกขั้นตอนที่เราสามารถเลือกได้จากรูปสามเหลี่ยมใด ๆ
- เราสามารถเคลื่อนที่ผ่านจุดกึ่งกลางของขอบหนึ่งไปยังหนึ่งในสามลูกของโหนดปัจจุบัน เราจะกำหนดให้การเคลื่อนไหวเหล่านี้เป็น
N
, และSW
SE
เช่นถ้าเราอยู่บนโหนด2
เหล่านี้จะนำไปสู่ต่อมน้ำ7
,8
,9
ตามลำดับ การเคลื่อนไหวอื่น ๆ ผ่านขอบ (ไปยังลูกหลานทางอ้อม) ไม่ได้รับอนุญาต - เราสามารถเลื่อนมุมหนึ่งในสามมุมนี้ได้โดยที่ไม่แตะที่ขอบของสามเหลี่ยมเพื่อไปยังผู้ปกครองโดยตรงหรือบรรพบุรุษทางอ้อมหนึ่งในสองคน เราจะกำหนดให้การเคลื่อนไหวเหล่านี้เป็น
S
, และNE
NW
เช่นถ้าเราอยู่บนโหนด31
,S
จะนำไปสู่10
,NE
จะไม่ถูกต้องและจะนำไปสู่NW
0
ความท้าทาย
กำหนดจำนวนเต็มสองค่าที่ไม่ใช่ลบx
และy
หาเส้นทางที่สั้นที่สุดจากx
ไปถึงy
โดยใช้เพียงแค่หกการเคลื่อนไหวที่อธิบายข้างต้น หากมีเส้นทางที่สั้นที่สุดหลายเส้นทางให้เลือกเส้นทางใดเส้นทางหนึ่ง
โปรดทราบว่ารหัสของคุณควรใช้งานได้มากกว่า 5 ระดับที่อธิบายไว้ในแผนภาพด้านบน x, y < 1743392200
คุณอาจจะคิดว่า สิ่งนี้ทำให้มั่นใจได้ว่ามันพอดีกับจำนวนเต็ม 32 บิต โปรดทราบว่าสิ่งนี้สอดคล้องกับ 20 ระดับของต้นไม้
รหัสของคุณจะต้องดำเนินการป้อนข้อมูลที่ถูกต้องใด ๆ ในน้อยกว่า 5 วินาที ในขณะที่กฎนี้ออกค้นหาความกว้างเดียรัจฉานครั้งแรกมันควรจะเป็นข้อ จำกัด ที่ค่อนข้างหลวม - การอ้างอิงของฉันจัดการกับการป้อนข้อมูลโดยพลการสำหรับความลึก 1,000 ในครึ่งวินาที (นั่นคือ ~ 480 ตัวเลขหลักสำหรับโหนด)
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์
เอาท์พุทควรจะแบนรายการที่ชัดเจนของสตริงN
, S
, NE
, NW
, SE
, SW
ใช้คั่นที่เหมาะสมใด ๆ (พื้นที่, linefeeds จุลภาค","
... )
ใช้กฎมาตรฐานของกอล์ฟ
กรณีทดสอบ
กรณีทดสอบสองสามข้อแรกนั้นสามารถทำได้ด้วยมือโดยใช้แผนภาพด้านบน คนอื่น ๆ มั่นใจได้ว่าคำตอบนั้นมีประสิทธิภาพเพียงพอ สำหรับผู้ที่อาจมีวิธีการแก้ปัญหาอื่น ๆ ที่มีความยาวเท่ากันที่ไม่ได้ระบุไว้
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE