คุณเป็นนักเดินทางข้ามทะเลทรายระหว่างสองเมือง คุณไม่สามารถอุ้มน้ำได้พอโดยไม่หยุด นี่คือรูปแบบของปริศนาคลาสสิก
กฎระเบียบ
ทะเลทรายมีลักษณะดังนี้: ตาราง WxH ของพื้นที่ว่างเปล่าส่วนใหญ่ พื้นที่ที่ทำเครื่องหมายไว้S
คือจุดเริ่มต้นของคุณE
คือที่ที่คุณต้องการสิ้นสุดและสี่เหลี่ยมจัตุรัสที่มีหมายเลข N ถือ N หน่วยของน้ำ สี่เหลี่ยมที่ทำเครื่องหมายด้วยการ.
ถือน้ำเป็นศูนย์
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
คุณเริ่มต้นที่ S ด้วยน้ำ 5 หน่วย
คุณสามารถบรรทุกน้ำได้มากที่สุด 5 หน่วย
ทุกครั้งที่คุณหัน
- เลื่อนหนึ่งช่องขึ้น, ลง, ซ้ายหรือขวา
- กินน้ำ 1 หน่วยที่คุณถืออยู่
- เลือกขึ้นหรือลดลงจำนวนหน่วยของน้ำ
เลี้ยวเป็น notated ดังนี้: (direction)(+|-)(units of water)
, +
แสดงว่าคุณจะหยิบขึ้นมาน้ำ-
ที่คุณกำลังลดต่ำลง
ตัวอย่างผลัดกัน:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
หากคุณทำท่าเหล่านี้โดยเริ่มต้นที่ S ในตัวอย่างด้านบนทะเลทรายจะมีลักษณะเช่นนี้ในภายหลัง
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
คุณสามารถรับน้ำไม่เกินกว่าที่มีอยู่แล้วในตารางของคุณ เมื่อคุณรับน้ำให้หักจำนวนหน่วยจากจำนวนกระเบื้อง
คุณสามารถรับน้ำได้สูงสุด 5 ยูนิตเท่านั้น
ไม่มีไทล์สามารถเก็บได้มากกว่า 9 หน่วยยกเว้น S ที่มียูนิตอินฟินิตี้
คุณสามารถหยดน้ำได้มากเท่าที่คุณถืออยู่ในปัจจุบัน
น้ำบนพื้นดินยังคงไม่เปลี่ยนแปลงจนกว่าคุณจะหยิบมันขึ้นมาอีกครั้ง
หากคุณกลับไปที่ S คุณสามารถรับน้ำปริมาณใด ๆ โดยไม่ทำให้เสีย
ถ้าคุณถึง E แล้วคุณจะชนะ คุณยังคงชนะถ้าคุณใช้น้ำหน่วยสุดท้ายของคุณใน E
ถ้าหลังจากการเปิดของคุณคุณจะมีน้ำเป็นศูนย์และคุณไม่ได้อยู่ใน E, คุณตาย
อินพุตและเอาต์พุต
โปรแกรมของคุณจะได้รับแผนที่เริ่มต้นที่มีขนาดตามอำเภอใจSTDIN
เป็นรูปแบบ ASCII ในรูปแบบด้านบน คุณสามารถสันนิษฐานได้ว่ามันเป็นรูปสี่เหลี่ยมผืนผ้านั่นคือทุกบรรทัดมีความยาวเท่ากันนั่นคือหนึ่งS
และหนึ่งE
ตารางทุกบรรทัดถูกยุติด้วย\n
และ STDIN ทั้งหมดจะสอดคล้องกับ regex นี้:/^[SE1-9\.\n]+$/
โปรแกรมของคุณจะเขียนผลลัพธ์ต่อไปนี้ไปยัง STDOUT:
- รายการเคลื่อนไหว
- สถานะสุดท้ายของแผนที่
คุณสามารถส่งออกรายการการเคลื่อนไหวในรูปแบบที่สะดวก
สถานะสุดท้ายของแผนที่จะถูกพิมพ์ในรูปแบบเดียวกับอินพุตยกเว้นว่าจะแสดงเส้นทางที่คุณเข้าไปในทะเลทรายโดยการทำเครื่องหมายแผ่นกระเบื้องที่เข้าชมทั้งหมดด้วย#
หากแผ่นนั้นไม่มีน้ำและไม่ใช่ S หรือ E (เช่น มันคือ.
)
อินพุตตัวอย่าง :
.....S.
.......
.......
E......
....8..
ตัวอย่างผลงานที่ชนะ:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
Nontriviality
เมื่อคุณโพสต์รหัสของคุณโพสต์ตัวอย่างการป้อนข้อมูลแผนที่ซึ่งรหัสของคุณค้นหาวิธีการที่สอดคล้องกับเงื่อนไขที่ไม่น่าสนใจดังต่อไปนี้:
- S และ E อยู่ห่างกันอย่างน้อย 10 ครั้ง
- สี่เหลี่ยมจัตุรัสใด ๆ ซึ่งในขั้นต้นมีหน่วยของน้ำ N จะต้องล้อมรอบด้วยเส้นขอบความกว้าง N ซึ่งสี่เหลี่ยมทั้งหมดเป็น
.
(ไม่มีน้ำไม่ใช่ S หรือ E)
ตัวอย่าง
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
หากคุณเพิ่มปริมาณน้ำบนกระเบื้องใด ๆ ข้างต้นจะไม่สำคัญ
ความต้องการ
สันนิษฐานว่าโปรแกรมของคุณจะประสบกับความพยายามที่ล้มเหลวหลายครั้งก่อนที่จะพบวิธีแก้ไขหากมี
- โปรแกรมของคุณต้องแก้ปัญหาอินพุตที่แก้ไขได้ในที่สุด
- ฉันต้องการที่จะดูคุณตาย - โปรแกรมของคุณจะส่งออกการเคลื่อนไหวและแผนที่ขั้นสุดท้ายของเส้นทางสู่ความตายสำหรับทุก ๆความพยายามที่ล้มเหลวในการหาทางออก
- หากคุณพบวิธีการแก้ปัญหาที่ชนะพิมพ์ออกเต็มรูปแบบสำหรับที่และยุติ
- เรียกใช้จนกว่าจะพบวิธีแก้ไขปัญหา แต่อย่าพยายามแก้ปัญหาเดียวกันสองครั้งความตายทั้งหมดควรอยู่ในเส้นทางที่ต่างกัน
- ใช้อินพุตทดสอบนี้:
(ต้องย้ายอย่างน้อยหนึ่งครั้งเพื่อปล่อยแคชน้ำที่จุดกึ่งกลาง)
S........
.........
.........
........E
รหัสที่สั้นที่สุดซึ่งถูกโพสต์พร้อมกับอินพุตการสาธิตที่ไม่สำคัญซึ่งจะแก้ปัญหาการชนะ