构建移动最少的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

并返回解决游戏的动作列表。每一步将采用以下格式:

  • 一个表示桩号的数字(18),或一个空单元格(AD),表示源桩号。
  • 另一个数字或字母,代表目标堆或空闲单元,或F表示该诉讼的基础。

输出将如下所示:

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

一旦将卡放入基础中,就无法将其删除。由于一次只移动一张卡,因此移动3张卡序列需要5步,而5张卡序列需要9步。

如果游戏无法解决,则您的程序应说明这一点。但是,您的程序必须能够解决任何可解决的游戏。

您的程序将根据原始Microsoft FreeCell程序中的32,768条交易进行判断。为了有效,您的程序必须成功解决除交易#11,982之外的所有交易,这是无法解决的。您的分数将是解决这32,767笔交易所需要采取的行动总数,其中较短的代码会成为平局。


具有以上规范要求的格式的所有文件的文件可在此处下载(5.00 MB文件):https : //github.com/joezeng/pcg-se-files/raw/master/freecell_decks


1
现在,我只需要获取他们用来生成32,768个游戏的随机数生成器即可。:S
Joe Z. 2015年


1
那是个很好的观点。例如,如果两个相同颜色和编号的卡(例如7C和7S)都在空闲单元中,您将如何处理?然后,如果您从“ C”移动到黑色8,则可能是这两张牌中的任何一张。
Joe Z.

2
通过消除所有可解决交易必须由提交解决的限制,您可能会得到一些答案。然后,根据已解决的交易数进行评分,然后按照最少的动作进行评分。
mbomb007 '17

1
卡片可以0索引吗?
tuskiomi

Answers:


22

C 64643字节,得分:〜650万

以下堆栈摘录(由Mego提供)将所有代码输出为单个独立的C文件:

在此处下载原始资源。使用GCC并运行,make然后使用自述文件中的指南。

我的格式不好(所有不同的文件都在一个代码块中),并且可能需要更多处理(12k字节)。任何帮助将被爱!

有些代码不是我的。我从未经版权保护的来源使用它。但是,我将输入/输出方法固定在挑战范围内(这是一个漫长的任务,因为我在C语言下(5个小时)很恐怖)。我还必须重新编写许多代码并调试所有内容。非常感谢我父亲的帮助并成为橡皮鸭(并指出我的内存管理错误),并感谢TNB上处理我关于段错误和C的愤怒言论的每个人。


您可能可以使用来绕过答案长度限制,并使所有代码都在答案之内,而不需要外部下载。
Mego

@Mego我的意思是,但是它存在几个文件中
Christopher

将多个C文件合并到一个文件中很容易。
Mego

是一个堆栈片段,显示了将代码合并到一个文件中的情况。
Mego

@mego您可以编辑吗?在移动设备上
Christopher,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.