摘要:分析:第二道IDA*题目。那个估价函数确实不好想,不过做了这道题目之后应该对IDA*的应用范围有了更为明确地了解。IDA*应用于搜索树的深度比较小,但是每一层扩展出来的节点呈指数增长,这样的话BFS空间上受不了,DFS时间上受不了。于是想到用迭代加深搜索,即ID搜索。但是普通的ID搜索并不能快很多,于是有了IDA*搜索。这当中最难的就是A*中的估价函数的设计,这一点需要充分利用题目中的条件,保证估价函数小于等于实际最优值,而且要尽量接近最优值。这样的话会快很多。代码:type arr=array[0..15] of integer;var a,b:arr; i,j,k,n,t,step,...
阅读全文
摘要:分析:经典的八数码问题,这里用的是heap+A*。A*很明显是用那个经典的A*,heap的维护和k短路非常像。第二个简单A*代码(模仿某人的):const nx:array[1..9] of integer=(1,1,1,2,2,2,3,3,3); ny:array[1..9] of integer=(1,2,3,1,2,3,1,2,3); ji:array[0..9] of longint=(1,1,2,6,24,120,720,5040,40320,362880);type arr=array[1..9] of integer;var q:array[0..10000] of i...
阅读全文
摘要:分析:非常好的记忆化搜索题目。非常经典的地方就是巧妙地记录了是否有地方连续7天没有下雨,直接用四个顶点表示是否有没有下雨的地方,用一个六维的数组进行判重,并且用到了位运算和二进制进行状态表示。非常好。代码:const nx:array[1..9] of integer=(0,-1,-2,0,0,1,2,0,0); ny:array[1..9] of integer=(0,0,0,-1,-2,0,0,1,2);type ji=record a,b,c,d:longint;end;var d:array[0..366] of longint; i,j,k,n:longint; now...
阅读全文
摘要:分析:经典剪枝。我的稍微加了点剪枝的搜索连10000,3,这个数据都出不来结果,主要原因在于剪枝减去的太少了,而且从小到大搜索剪枝效果非常不好。后来参考了一下一个c++程序,非常快,16ms。首先根据V=H*R*R,S=2*H*R可知2*V/S等于面积,这一面积是可能的最小面积。加上这个剪枝后非常快。代码1:var ans,maxh,maxr,n,m:longint;procedure dfs(v,h,r,deep,s:longint);var maxhh,maxvv,i,j:longint;begin if v<r*r*h*(m-deep+1) then exit; if v<0
阅读全文
摘要:基础的BFS题目,但是发现自己好久没有做过搜索题了,这道题做的很不爽,尤其是方向常量的处理,完全抄袭了他人的。代码:const nx:array[0..2,1..4] of integer=((1,-2,0,0),(1,-1,0,0),(0,0,-1,2)); ny:array[0..2,1..4] of integer=((0,0,1,-2),(0,0,-1,2),(1,-1,0,0)); ns:array[0..2,1..4] of integer=((2,2,1,1),(1,1,0,0),(2,2,0,0));type ji=record x,y,s,w:longint;end...
阅读全文
摘要:分析:直接dfs即可,没什么。只不过从1,1开始搜时间是1000++,从n,n开始搜时间是16ms。差距。所以最好的办法就是随机搜索。poj上另外的两个soduku就不是简单的搜索能通过的了,3074的很多数据单个都不能很快出结果,对3076更慢,只能用dancing links来优化或者彻底改变搜索方式+加上强剪枝。代码:var z,h,l:array[1..9,1..9] of boolean; a:array[1..9,1..9] of integer; b:array[1..9,1..9] of integer; t,i,j,k:longint; ch:char; vv:b...
阅读全文
摘要:分析:状态压缩的BFS或者dfs状态+最短路。前者就是类似于拯救大兵瑞恩的方法,后者非常经典,dfs全排列枚举然后根据最短路相加。WA三次+TLE一次+AC。代码:const nx:array[1..4] of integer=(0,0,1,-1); ny:array[1..4] of integer=(1,-1,0,0);type ji=record x,y,s,step:longint;end;var v:array[0..1027,0..24,0..24] of boolean; q:array[0..1000000] of ji; b:array[0..25,0..25]...
阅读全文