pascal……小兵过街问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 19:31:48
已知有一人,要通过直线街道从A点到达B点(均在20×20 的正方形中),只能往下或往右走,求所有路线。
要求,采用递归算法
在线等…………

你这个题有没有时间限制啊??
要是用递归算,好像超时。。。。。。
反正我的这个递归是超时了,到17就不行了,反正就是这么个方法,你看看吧
program ex1;
function find(x,y:integer):int64;
begin
if (x=1)and(y=1) then find:=1
else
if x=1 then find:=find(x,y-1)
else
if y=1 then find:=find(x-1,y)
else
find:=find(x-1,y)+find(x,y-1)
end;
begin
writeln(find(20,20));
end.

楼上的 请你用二分的递归分治
不要一层一层推......

(1)首先我们把右下角的点的坐标记为(20,20),左上角的为(1,1);
(2)如果想要知道到达(20,20)的路径有多少,就需要知道到达(20,19)和(19,20)的路径有多少,因为只能向右或向下走;
(3)同理,要知道到达(20,19)的就需要知道(20,18)和(19,19)的……
(4)直到你撞了墙,比如到达了(1,5),(1,6)或(5,1),(6,1)等,由于这些点只能由上面或左边到达,故只有一种方法;由此可建立递归的关系
(5)注意到在计算(20,20)时需要计算(20,19)和(19,20),而计算它们则需要计算(19,19);该点至少被计算三次;顶点越接近出发点,重复计算次数越多。因此可以在计算出一个点之后将该点的方案数记录下来,下一次就不必再求,直接调用。这是记忆化搜索的思想。