สร้างตัวแก้ Freecell ที่เคลื่อนไหวน้อยที่สุด


54

ในเกมของ Freecell คุณจะได้รับมอบหมายให้สร้างเสาเข็มสี่กองในชุดสูทจากเอซถึงราชาในเลย์เอาต์ที่คุณสร้างขึ้นลงในสีสลับ อย่างไรก็ตามคุณสามารถสร้างการ์ดได้ครั้งละหนึ่งใบเท่านั้นดังนั้นคุณจะได้รับ "เซลล์ฟรี" สี่ใบซึ่งแต่ละการ์ดสามารถมีการ์ดเดียวเพื่อช่วยให้คุณย้ายลำดับทั้งหมด ความคิดคือคุณสานการ์ดแต่ละใบเข้าและออกจากเซลล์อิสระตามต้องการเพื่อช่วยคุณแก้ปัญหาเกม

งานของคุณคือสร้างโปรแกรมที่จะแก้ปัญหาเกมเหล่านี้ให้น้อยที่สุดเท่าที่จะทำได้

โปรแกรมของคุณจะป้อนข้อมูลตามลำดับของการ์ด 52 ใบในรูปแบบต่อไปนี้:

2S 9H 10C 6H 4H 7S 2D QD KD QC 10S AC ...

ซึ่งจะได้รับการจัดการในรูปแบบเริ่มต้นตามลำดับนี้:

01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52

และส่งคืนรายการการเคลื่อนไหวเพื่อแก้ไขเกม การย้ายแต่ละครั้งจะอยู่ในรูปแบบนี้:

  • ตัวเลขที่แสดงถึงจำนวนเสาเข็ม ( 1ผ่าน8) หรือเซลล์ว่าง ( AถึงD) ซึ่งแสดงถึงเสาเข็มต้นทาง
  • ตัวเลขหรือตัวอักษรอื่น ๆ ที่แสดงถึงปลายทางของกองหรือเซลล์อิสระหรือFสำหรับรากฐานของชุดนั้น

ผลลัพธ์จะมีลักษณะดังนี้:

18 28 3A 8B 8C 85 B5 35 4F etc.

เมื่อใส่การ์ดเข้าไปในฐานแล้วจะไม่สามารถนำการ์ดออกได้ เนื่องจากมีการย้ายไพ่เพียงครั้งเดียวในแต่ละครั้งการย้ายลำดับของไพ่ 3 ใบต้องมีการย้าย 5 ครั้งและลำดับของไพ่ 5 ใบต้องมีการย้าย 9 ครั้ง

หากเกมไม่สามารถแก้ไขได้โปรแกรมของคุณควรระบุเช่นนี้ อย่างไรก็ตามโปรแกรมของคุณจะต้องสามารถแก้ปัญหาเกมที่แก้ไขได้

โปรแกรมของคุณจะถูกพิจารณาตามข้อเสนอ 32,768 ข้อที่พบในโปรแกรม Microsoft FreeCell ดั้งเดิม เพื่อให้ถูกต้องโปรแกรมของคุณจะต้องแก้ปัญหาได้สำเร็จทุกข้อยกเว้นดีล # 11,982ซึ่งไม่สามารถแก้ไขได้ คะแนนของคุณจะเป็นจำนวนการเคลื่อนไหวทั้งหมดที่ใช้ในการแก้ข้อเสนอ 32,767 ข้อโดยรหัสที่สั้นลงจะเป็นตัวแบ่งไทเบรก


ไฟล์ที่มีสำรับทั้งหมดในรูปแบบที่ต้องการโดยข้อกำหนดข้างต้นสามารถดาวน์โหลดได้ที่นี่ (ไฟล์ขนาด 5.00 MB): https://github.com/joezeng/pcg-se-files/raw/master/freecell_decks


1
ตอนนี้ฉันแค่ต้องจับตัวสร้างตัวเลขสุ่มที่พวกเขาเคยสร้างเกม 32,768 : S
Joe Z.

3
เครื่องกำเนิดไฟฟ้าอยู่ที่นี่: rosettacode.org/wiki/Deal_cards_for_FreeCell
nutki

1
นั่นเป็นจุดที่ดี คุณจะจัดการกับกรณีที่พูดว่าไพ่สองใบที่มีสีและหมายเลขเดียวกัน (เช่น 7C และ 7S) ทั้งสองอยู่ในเซลล์ว่างได้อย่างไร ถ้าคุณย้ายจาก "C" ไปเป็นสีดำ 8 อาจเป็นได้ทั้งสองใบ
Joe Z.

2
คุณอาจได้รับคำตอบโดยการลบข้อ จำกัด ที่ข้อตกลงที่แก้ไขได้ทั้งหมดจะต้องได้รับการแก้ไขโดยการส่ง จากนั้นให้คะแนนตามจำนวนข้อเสนอที่ได้รับการแก้ไขจากนั้นย้ายน้อยที่สุด
mbomb007

1
บัตรสามารถเป็นดัชนี 0
tuskiomi

คำตอบ:


22

C 64,643 bytes คะแนน: ~ 6.5 ล้าน

Stack Snippet ต่อไปนี้ (ความอนุเคราะห์ของ Mego) แสดงผลโค้ดทั้งหมดเป็นไฟล์ C แบบสแตนด์อโลนเดี่ยว:

ดาวน์โหลดต้นฉบับที่นี่ ใช้ GCC และเรียกใช้makeจากนั้นใช้แนวทางใน readme

การจัดรูปแบบของฉันไม่ดี (ไฟล์ต่าง ๆ ทั้งหมดอยู่ในบล็อกโค้ดเดียว) และไฟล์นี้สามารถเล่นได้มากขึ้น (12k ไบต์ต่อโท) ความช่วยเหลือใด ๆ จะได้รับความรัก!

รหัสบางส่วนไม่ใช่ของฉัน ฉันใช้มันจากแหล่งที่ไม่มีลิขสิทธิ์ อย่างไรก็ตามฉันได้กำหนดวิธีการอินพุต / เอาท์พุทให้อยู่ในความท้าทาย ฉันยังต้องเขียนโค้ดอีกมากและแก้ไขข้อบกพร่องทุกอย่าง ขอขอบคุณพ่อของฉันที่ช่วยเหลือและเป็นเป็ดยาง (และชี้ให้เห็นถึงข้อผิดพลาดในการจัดการหน่วยความจำของฉัน) และสำหรับทุกคนในไตรวิว


คุณอาจสามารถใช้สิ่งนี้เพื่อจำกัดความยาวของคำตอบและใช้รหัสของคุณทั้งหมดในคำตอบแทนที่จะต้องดาวน์โหลดภายนอก
Mego

@ ฉันหมายถึงใช่ แต่มันมีอยู่ในหลาย ๆ ไฟล์
Christopher

มันง่ายที่จะรวมไฟล์ C หลาย ๆ ไฟล์ไว้ในไฟล์เดียว
Mego

นี่คือตัวอย่างสแต็กที่แสดงรหัสที่รวมกันเป็นไฟล์เดียว
ชำเลือง

@mego คุณสามารถแก้ไขได้ไหม บนมือถือ
Christopher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.