小case!
我高中时专搞这种问题(我是省奥林匹克竞赛一等奖 ^-^ (1992年)
那时 我用的是Turbo Pascal 6.0;大学时转向C/C++;
我是 Borland 公司 的 坚决拥护着, 最反感 "B.该死"的产品!
这个问题最简单的算法 有两个:
1. 深度优先搜索 (或者 搜索回朔: 如果要找最短路径,
需要遍历整个解空间
2. 宽度优先搜索:第一个解就是最优解.
(真累! )
1. dfs 递归算法
program dfs
var
a:array[1..n,1..m] of integer;
vx:array[1..4] of integer =[0,1,0,-1];
vy:array[1..4] of integer =[1,0,-1,0] ;
x,y:integer;
pathx,pathy :array[1..100] of integer;
procedure go(c:integer);
var i:integer;
begin
for i:=1 to 4do
if a[x+vx,y+vy]=1 and x,y 不出界 then
begin
x:=x+vx ;
y:=y+vy;
a[x,y]:=2;
pathx[c]:=x;
pathy[c]:=y;
if x=x0 and y=y0 then
输出解 { 或者 保存 较优解)
else
go(c+1);
a[x,y]=1;
x:=x-vx[c];
y:=y-vy[c];
end
begin
初始化 a {0 为墙, 12为路),x,y,
go(1);
输出 最优解;
end.
2. wfs
program wfs
type node=结点;
var q1,q2:node
begin
初始化 根节点, q1,q2;
repeat
从q1 中取出节点
for i:=1 to 4do
begin
生成子节点 t1 ,
如果已经到出口, 跳出
if t1 not in q2
append t1 to q1;
end
父节点 入 q2
until 队列空
如果找到解, 由最后一个节点上溯至根节点,
记下路径, 就是最优解.
释放 q1,q2;
end .
wfs 中 如果对q1 的入队次序加以优化, 即可
派生出其他算法 如 A 算法, A* 算法
手腕都酸了, 好意思不给我分数吗?
后记...........
好多年没写过这样的程序了,一时兴起, 写了这些算法;
这么多年了 一直用 RAD 工具 , 写的都是 豆腐快似的
程序, 在我的心目中 编程最大的乐趣在于设计了好的算法:
优美的, 简明的 , 高效的 算法;
现在的新一代程序员似乎
已经忘了什么是"算法"!
好怀念高中的Turbo Pascal 与 大学的 Turbo C/C++ !!