百度空间 | 百度首页 
 
查看文章
 
2005年百度之星程序设计大赛总决赛题目
2007-05-09 13:57

题目描述

八方块移动游戏要求从一个含8个数字(用1-8表示)的方块以及一个空格方块(用0表示)的3x3矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换,直至达到所定义的目标状态。空格方块在中间位置时有上、下、左、右4个方向可移动,在四个角落上有2个方向可移动,在其他位置上有3个方向可移动。例如,假设一个3x3矩阵的初始状态为:
    8 0 3
    2 1 4
    7 6 5
目标状态为:
    1 2 3
    8 0 4
    7 6 5
则一个合法的移动路径为:
    8 0 3     8 1 3     8 1 3     0 1 3     1 0 3     1 2 3
    2 1 4 => 2 0 4 => 0 2 4 => 8 2 4 => 8 2 4 => 8 0 4
    7 6 5     7 6 5     7 6 5     7 6 5     7 6 5     7 6 5

另外,在所有可能的从初始状态到目标状态的移动路径中,步数最少的路径被称为最短路径;在上面的例子中,最短路径为5。如果不存在从初试状态到目标状态的任何路径,则称该组状态无解。

请设计有效的(细节请见评分规则)算法找到从八方块的某初试状态到某目标状态的所有可能路径中的最短路径,并用C/C++实现。

输入数据

程序需读入已被命名为start.txt的初始状态和已被命名为goal.txt的目标状态,这两个文件都由9个数字组成(0表示空格,1-8表示8个数字方块),每行3个数字,数字之间用空格隔开。

输出数据

如果输入数据有解,输出一个表示最短路径的非负的整数;如果输入数据无解,输出-1

自测用例

如果输入为:start.txtgoal.txt,则产生的输出应为:
5

又例,如果用
7 8 4
3 5 6
1 0 2
替换start.txt中的内容,则产生的输出应为:
21

评分规则

1)我们将首先使用和自测用例不同的10start.txt以及相同的goal.txt,每个测试用例的运行时间在一台Intel Xeon 2.80GHz 4 CPU/6G 内存的Linux机器上应不超过10秒(内存使用不限制),否则该用例不得分;

2)每个选手的总分(精确到小数点后6位)=10秒钟内能产生正确结果的测试用例数量x10+1/产生这些正确结果的测试用例的平均运行毫秒)

3)如果按此评分统计仍不能得出总决赛将决出的一、二、三等奖共计九名获奖者,我们将先设N=2,然后重复下述过程直至产生最高的9位得分:用随机生成的另外10个有解的start.txt再做测试,并对这10*N个测试用例用2)中公式重新计算总分,N++


类别:百度之星历年题目 | 添加到搜藏 | 浏览() | 评论 (57)
 
最近读者:
 
网友评论:
1
2007-05-12 19:59 | 回复
没学不知道! 哎! 真想什么都会!
 
2
2007-05-13 16:49 | 回复
8 0 3 2 0 3 2 1 3 1 2 3 2 1 4 =>8 1 4=>8 0 4=>8 0 4 7 6 5 7 6 5 7 6 5 7 6 5 这个例子的最短路径是 3 么
 
3
2007-05-14 10:46 | 回复
1 和 2 是不可以换的; 只有*(1-8)和0(空位)交换才可以!
 
4
2007-05-14 17:40 | 回复
Guang :路径是5呀,上面也写很清楚了,想想吧 先是用0和1换8 1 3 2 0 4 7 6 5 再用0和2交换8 1 3 0 2 4 7 6 5 再是0和8交换0 1 3 8 2 4 7 6 5 然后0和1交换1 0 3 8 2 4 7 6 5 最后是0和2换1 2 3 8 0 4 7 6 5 这样经过五次的交换就达到了最后我们要的结果了,如果先用0和8换也可以达到要的结果的,但这样就交换了7次,别的交换方法就根多了,所以这种交换方法是最省时的,因此最短路径是5
 
5
2007-05-14 20:35 | 回复
这种题目也拿出来比赛。
 
6
2007-05-14 20:53 | 回复
初赛用这样的题目,狠好了,再难了打击大家的积极性嘛
 
7
2007-05-15 11:33 | 回复
你没看到它写的是“2005年百度之星程序设计大赛总决赛题目”呀 我都没电脑,不知道怎么参加
 
8
2007-05-15 13:58 | 回复
原来看错题目了,确实只能移动0来和别的位置对换。 还有一个疑问就是,目标文件也是变来变去的吗?
 
9
2007-05-16 09:05 | 回复
用图论来作
 
10
2007-05-16 13:11 | 回复
A*算法
 
11
2007-05-17 13:00 | 回复
是不是可以用动规哦
 
12
2007-05-17 13:04 | 回复
就是拼图了
 
13
2007-05-17 14:03 | 回复
这题目已经不简单了。
 
14
2007-05-17 15:05 | 回复
最后的冠军是谁?
 
15
2007-05-17 15:15 | 回复
看一遍题目就晕了!~ 难度不小啊!~
 
16
2007-05-17 15:24 | 回复
BFS呀..
 
17
2007-05-17 15:28 | 回复
要是有代码法上来看看就好了,呵呵。 算法确实有很多奥妙啊,能够精通各种算法的人确实是很了不起的。
 
18
2007-05-17 15:45 | 回复
nnd,我怎么知道哪个pattern离目标最近? 相似度? 真难
 
19
2007-05-17 15:47 | 回复
有没有代码啊 有助于我们的提高 多学点也好! 呵呵!
 
20
2007-05-17 17:13 | 回复
做不来啊!看来知识不够
 
21
2007-05-17 17:27 | 回复
K,我C语言都没有学会,还看个什么劲呀!
 
22
2007-05-17 17:34 | 回复
研究过一个路径分析的东东,跟这个很象
 
23
2007-05-17 17:59 | 回复
这些都没有答案提示吗?
 
24
2007-05-17 18:03 | 回复
应该不难
 
25
2007-05-17 18:33 | 回复
不懂,我现在才上初中...想学... 我是浙江杭州的...想学.. ~~~~ 我很想学哦....想学~~
 
26
2007-05-17 18:49 | 回复
这个我喜欢
 
27
2007-05-17 19:17 | 回复
晕,,,,昨天看《离散数学》时候有一章讲轮换、对换的。。。应该与这方面有关吧,,,可惜没认真学啊,,,,,做计算机这一行,,数学一定得好,,高等数学。。离散数学,,数据结构,,,,不吃透是不行啊
 
28
2007-05-17 19:21 | 回复
所以要好好学习,天天线上
 
29
2007-05-17 19:21 | 回复
ANSI是关于什么的编程啊我就学过C/C++
 
30
2007-05-17 20:11 | 回复
刚开始学```明年再来```
 
31
2007-05-17 21:13 | 回复
**.txt,这是什么语言的后缀名??C/C++??
 
32
2007-05-17 21:16 | 回复
没事来看看呵呵
 
33
2007-05-17 21:23 | 回复
A*算法,可以解决。。 再加上压缩处理,速度会更快一些~~
 
34
2007-05-17 21:30 | 回复
他这数据的输入是通过手动输入,还是程序自动读取文件?
 
35
2007-05-17 22:40 | 回复
这种题目也来出来比赛,太那个了 五个小时我是没法把程序调通,不过很幸运,前天我刚刚调通一个程序,和这个一模一样,于是我可以直接把代码粘过去,如果可以的话。我还找到了很好的评估函书呢。 八数码问题,每个学过人工智能的人都会做得吧。
 
36
2007-05-17 22:43 | 回复
这个有以前参加过的吗?能不能说说具体怎么做? 想算法的时间包括在这两个小时之内吗?
 
37
2007-05-19 18:20 | 回复
BFS啊。决赛怎么可能出这么容易的题目?!
 
38
2007-05-19 18:32 | 回复
BFS。。。。6G内存。。。。 大概够了吧。。。。
 
39
2007-05-20 12:00 | 回复
我们才学了数据结构,唉,没学好啊
 
40
2007-05-20 18:30 | 回复
要是有源代码就好了
 
41
2007-05-22 00:02 | 回复
有意思,完全一个指计+数组+择优算法 7 8 4 3 5 6 -->78462013 0 在外围可以横着走,不影响位置视图。 1 0 2
 
42
2007-05-22 09:53 | 回复
上面思路有错,有空再来玩。
 
43
2007-05-22 21:03 | 回复
难道决赛就一道题?还有,为什么只让用C/C++来编,别的不可以吗? 我刚参加了ACM学校初赛,感觉算法和数据结构难的要命。 不知道百度之星程序设计大赛的出赛题目如何? 我明年一定参加!
 
44
2007-05-23 14:52 | 回复
这学期学的人工智能问题可以解决这个问题 涉及到了树和搜索 最重要到的是搜索 可以用启发式搜索 用全局择优搜索来解决 也可以使用 有界深度搜索 这个时间可能要长点 至于如何来表示一个节点的未来发展方向 用到了树这个结构 但是我 没学过 那我向可以用链表代替
 
45
2007-05-23 14:59 | 回复
时间可能比较短 调试程序特费时间 特别是用到指针的时候 那就要发疯了 唉!!!! 5个小时 !!o(∩_∩)o...哈哈 就这么的吧
 
46
2007-05-23 22:51 | 回复
八个格的每一种摆法可以看作一种状态。使用启发式搜索,宽度优先,在同层上依据当前状态和目标状态的相似度加以权重,优先搜索权重最大的一枝。同时加上剪枝:对于碰到的每种状态,记录从根到这一状态所经历的层数,如果以前记录的层数小于当前的这个层数,则剪掉这一枝。至于状态间的比较,可以全部变成位与运算。用9位表示一个数及其位置,如果该数位于第i个格,9位中的第i位置1,其余置零。至于记录到达每一状态所用的层数,可以用一个9维数组,如到达状态012345678(从左往右从上到下)所经历的层数为array[0][1][2][3][4][6][7][8]的值(当然,用一维数组去模拟这个9维数组也是完全可以的)。 没仔细想,但觉得由于总状态数只是9!个,所以加上剪枝,搜索空间不会很大
 
47
2007-05-25 09:24 | 回复
A*确实可以求解八数码问题,但是A*不能保证求得的是最短路径吧。
 
48
2007-05-25 11:34 | 回复
最好用穷举法,把9!=362880种的结果先算好,直接取结果!肯定最快!
 
49
2007-05-25 13:06 | 回复
有好难了呢!自已没做出来就别吹牛!
 
50
2007-05-26 15:08 | 回复
程序实现只是起码的要求。问题是要你的程序能用尽可能短的时间内算出来。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu