随笔分类 -  八数码难题

eight - zoj 1217 poj 1077
摘要:学习了多位大牛的方法,看看到底能把时耗降到多少?A* 1 // zojfulltest: 30000ms 2 # include 3 # include 4 # include 5 # include 6 7 # define DATA(x,i) (((x)>>((i)*3))&0x7) 8 # define ZERO(x) ((x)>>27) 9 # define F(x) ((x)&0xFF) 10 # define D(x) (((x)>>8)&0xF) 11 # define P(x) ((x)>>12) 12 # 阅读全文

posted @ 2013-09-04 21:12 getgoing 阅读(938) 评论(0) 推荐(0)

UVa 10181 - 15-Puzzle Problem
摘要:题目链接不好找:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1122用的 IDA*,跑了6.536s,时限是45s(刚看了627个人通过,我是第515名……,排行榜比较恐怖啊,见下图)这道题的逆序剪枝和八数码不同,具体参考这篇文章:http://mathworld.wolfram.com/15Puzzle.html1A! 1 # include <stdio.h> 2 # include <math.h> 阅读全文

posted @ 2012-05-27 13:09 getgoing 阅读(1772) 评论(0) 推荐(0)

ZOJ 1217 eight
摘要:八数码,双广、A*都超时了(可能是写得不好),IDA*通过了;在POJ上是16MS(和双广一样,A* 60MS左右),HDOJ上是800MS左右(双广是500MS),ZOJ上只有IDA*没超时(2480MS)。 1 # include <stdio.h> 2 # include <math.h> 3 # include <string.h> 4 5 # define MIN(x, y) ((x)<(y) ? (x):(y)) 6 7 # define N 9 8 # define DIR_N 4 9 # define INF 0x7fffffff 10 阅读全文

posted @ 2012-05-27 01:07 getgoing 阅读(1252) 评论(0) 推荐(0)

八数码(IDA*)
摘要:IDA*+曼哈顿 相当快! 通过五组数据总计用时 0.015000 s.把宏定义中的N和SIZE改一下,就可以处理十五数码问题了,终于修炼到第八层了;刚开始还是使用结构体定义了状态,写得相当麻烦,后来发现IDA*中不像BFS和A*,只需要考虑一条路,,参考了lym(http://www.cnblogs.com/liyongmou/archive/2010/07/19/1780861.html)的(后面调试的受不了了,对照着此大牛的代码一点点改,最后发现是更新状态时,npos写成了pos……)# include <stdio.h># include <math.h># i 阅读全文

posted @ 2012-05-27 00:51 getgoing 阅读(2026) 评论(0) 推荐(0)

八数码(A*)
摘要:第一道A*,照着A*的框架写的,不是很理解A*,写的也很长,中间有些标记的不太理解,去掉标记在POJ提交通过了,还是没理解A*的思想;犯了个低级错误:在判断新状态 0 的位置(nx, ny)是否越界时,应该是0 =< nx < 3,结果写成了0<= nx <=3,还叫LJ大牛一块查,最后终于给发现了;在写 A* 之前以为 A* 会省不少空间(扩展的节点相比 BFS 少很多),实际上却开了两个大数组: f[] 和 g[],一下子感觉也挺浪费的,时间上感觉快了很多,我测试的几组都是0MS,在POJ上提交是64MS;两周以前就决心花几天时间搞八数码和十五数码(主要是想学学A* 阅读全文

posted @ 2012-05-24 23:49 getgoing 阅读(1316) 评论(0) 推荐(0)

POJ 1077 eight
摘要:双广,16MS,相当快。 1 # include <stdio.h> 2 # include <string.h> 3 4 # define MAXN (362880 + 5) 5 6 typedef struct 7 { 8 char a[9]; 9 }state; 10 11 typedef struct 12 { 13 int k; 14 char d; 15 }path; 16 17 path p[MAXN]; 18 const char md[4] = {'u','l','r','d'}; 19 阅读全文

posted @ 2012-05-20 21:33 getgoing 阅读(434) 评论(0) 推荐(0)

八数码(双向广搜)
摘要:早上看了提到双向广搜的一篇文章,其中讲了双向广搜可以节约一半的时间和一半的空间(理论上),我画了一幅图:(上面的对应普通BFS,下面的对应双向广搜)可以看出简单BFS的搜索节点大约是双向广搜的二倍。对于八数码问题,由于逆序剪枝可以将所有无解的状态全部剪掉,剩余的都是有解的状态,所以使用双向广搜速度可能会更快;对下面两组数据(分别输入)1 2 3 4 5 6 7 8 08 7 6 5 4 3 2 1 02 6 4 1 3 7 0 5 88 1 5 7 3 6 4 0 2正确输出对应是 30、 31使用BFS的运行时间:0.390s 0.359s使用双广的运行时间:0.109s 0.046s双广我 阅读全文

posted @ 2012-05-20 18:16 getgoing 阅读(5059) 评论(0) 推荐(1)

八数码(BFS)
摘要:参考白书的方法,将每一个状态映射到一个9位整数,然后再映射到它在所有状态中的大小位置(编码)来减少内存使用;按照 POJ eight这道题的输入形式写的(对空格的处理参考了Staigner大牛的做法:用scanf一个字符串来读取);输入包括初始状态和目标状态,输出为最短距离,如果无解,输出 -1;逆序的剪枝比较难理解:当前状态逆序数+已走步数与目标态逆序数同奇偶则有解,有解状态不会扩展出无解状态,反之也成立,初始状态的逆序数+初始态与目标态之间空格的Manhattan距离与目标态同奇偶择有解,反之无解;LJ 大牛提出了另一种剪枝的方法:将目标态中任意非零数互换位置得到的状态是无解状态可以达到的 阅读全文

posted @ 2012-05-15 22:39 getgoing 阅读(1176) 评论(0) 推荐(0)

导航