第一阶段入门级竞赛的第一个问题(Maze of Life)于 2011 年 4 月 18 日发布并于 2011 年 5 月 9 日关闭(美国太平洋夏令时)。
您需要在 2011 年 5 月 9 日中午 12:00(美国太平洋夏令时)前提交您的答案。 请参阅竞赛规则了解详情,或访问此问题的专用论坛向其他人请教。 祝您好运!
Maze of Life
Maze of Life 是 Andrea Gilbert 设计的一款智力游戏(http://www.clickmazes.com/)。它从 Game of Life 的初始设置及标准规则开始计算连续代数,初始设置中的一个细胞被指定为智能细胞,并且网格上的一个点被指定为目标位置。在 Game of Life 的各代之间,智能细胞可以移动到其当前位置周围的空网格点,也可以停留在当前网格点不动。通过将智能细胞放入任何其他网格来计算下一代死亡和存活细胞。此游戏的目标是让智能细胞活着移动到目标网格点。如果智能细胞尚未到达目标网格点就已死亡,则游戏结束。
问题描述:
编写多线程代码以找到生命迷宫输入实例的解决方案。此应用程序的输入内容来自命令行上列出的第一个文本文件。此文件将包含游戏起始网格的初始配置。此应用程序的输出内容将是智能细胞从起始网格点到目标网格点的路径,并且此路径储存在命令行上列出的第二个文件中。此路径必须保证智能细胞活着从起始位置到达目标位置,并且从一代到下一代与其他存活细胞交互。
输入描述:
此程序的输入内容来自命令行上一个指定的文本文件。该文件的第一行是表示网格大小(行数和列数)的两个整数。为设置一个共同的参考点,保持参考一致,将网格的左上角设定为 (1 1) 位置。该文件的第二行是目标网格点的坐标。第三行是智能细胞的起始坐标。其余行是处于游戏初始状态的其他“存活”细胞的坐标。该文件的每一行都将包含 10 个整数,彼此之间至少隔一个空格。它们代表 5 个存活细胞的坐标对。双零标记 (0 0) 表示存活细胞坐标的终点。每行 10 个整数的例外将发生在该文件的最后一行,其中可能少于 5 个坐标及标记。
输出描述:
此应用程序将输出一个列表,其中列出智能细胞到达目标点所经过的路径。每次移动用“0”至“8”之间的一个整数数字表示。使智能细胞停留在当前网格点的移动用“0”表示,如果位置发生变化,则按顺时针从左上角(对角线)“1”开始连续对周围 8 个单元格进行编号,到“8”为止。(例如,如果指定向上移动(北)为“2”,则向下,再向右的对角移动(东南)将被指定为“5”。)输出文件中的行将包含 40 个数字,彼此之间无空格,最后一行可能会少于 40 个字符。如果给定的方格图没有可能的解决方案,则输出文件应该包含一条消息,说明这一点。
输入命令行示例: ./mazeoflife gridin.txt pathout.txt
输入文件示例,gridin.txt:
7 7
4 6
4 2
1 4 2 3 2 5 3 4 5 4
6 3 6 5 7 4 0 0
输出文件示例,pathout.txt:
解决方案路径:
3845524
计时:
将使用此程序的总执行时间进行计分。为得到最准确的计时结果,所提交的代码需要包含计时代码并将计算出的总执行时间打印到标准输出,否则将使用外部秒表计时。
计分注意事项:
一个给定的方格图可能有多个解决方案。如果能找到最短路径将会有一些奖励。因此,利用该应用程序的执行时间得到的总分将以 100 为基数,减去用于评判的方格图数(具有解决方案)的 5 倍。例如,如果有 4 个方格图,则最佳总执行时间的执行分是 80。输出最短路径的程序将获得每个方格图 5 分的“奖励”。此奖励并非独占,输出相同长度路径的多个程序都可以获得,即使这些程序发现不同的解决方案。
Game of Life:
Conway 的 Game of Life 是在矩形网格上模拟生物生存和死亡的一款游戏。从理论上讲,此网格应该是无界限的,但是由于可用于计算机模拟的内存有限,所以我们需要限制网格“宇宙”的大小。每个网格点要么被存活的生物占用,要么为空。被占用的点表示有存活生物,而空点表示死亡生物。该游戏按照一定规则让细胞一代一代地经历出生与死亡。
可以根据以下规则将细胞的状态从一代更改为下一代:
* 一个细胞周围分布有 8 个其他细胞,分别水平、垂直、对角地与其相邻。
* 如果一个存活细胞只有 0 个或 1 个存活的相邻细胞,则此细胞在下一代将会饿死。
* 如果一个存活细胞有 4 个或更多存活的相邻细胞,则此细胞在下一代将会挤死。
* 如果一个存活细胞有 2 个或 3 个存活的相邻细胞,则此细胞在下一代仍可存活。
* 如果一个细胞死亡,但它正好有 3 个存活的相邻细胞,则该细胞在下一代会复活。所有其他的死亡细胞在下一代仍然死亡。
* 所有的出生和死亡都是同时发生,因此死亡的细胞可以帮助相邻细胞获得新生,但是不能通过减少拥挤来阻止其他细胞死亡,也不能杀死出生的细胞或保护上一代中存活的细胞。
在
网站上玩了下这个游戏,发现总觉得有点bug,要求是细胞同生同死的,就是说细胞出现和消失时同时发生的。可以看了源码lifeMap类中的lifeScan()方法中,创建新的al的数组。然后是从坐标0开始遍历,如果按照细胞规则的情况(<=1||>3死亡,2||3存活,3的可以再生),不就谈不上细胞是同时死亡或出生的吗?应该是从坐标(0,0)开始接受死亡或者出生的。
源码我已经下载反编译出来了。
没有一点点注释,哎,老外写代码也正是的。
欢饮看代码爱好者下载分析。
http://download.csdn.net/source/3262596
游戏网站:http://www.clickmazes.com/life/ixlife.htm