最小转弯 pascal

来源:百度知道 编辑:UC知道 时间:2024/06/07 04:28:31
给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图1,最少的拐弯次数为5。
【输入格式】
第1 行:n m
第2 至n+1行:整个地图地形描述(0:空地;1:高山),
如(图1)
第2 行地形描述为:1 0 0 0 0 1 0
第3 行地形描述为:0 0 1 0 1 0 0
……
第n+2 行:x1 y1 x2 y2 (分别为起点、终点坐标)
【输出格式】:s (即最少的拐弯次数)
【输入输出样例】(见图1):
输入:(turn.in)
5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7
输出:(turn.out)
5

1、动态规划
方程是:
f[x,y,0](表示到达坐标为(x,y)的点,以竖直方向为直线方向)
f[x,y,1](表示到达坐标为(x,y)的点,以水平方向为直线方向)
f[x,y,0]:=min{f[x-1,y,0],f[x+1,y,0],f[x-1,y,1]+1,f[x+1,y,1]+1}((x+/-1,y)点不是高山)
f[x,y,1]:=min{f[x,y-1,1],f[x,y+1,1], f[x,y-1,0]+1,f[x,y+1,0]+1}((x,y+/-1) 点不是高山)
具体程序自己写吧
2、搜索
具体程序还是你自己写,很简单,只需要判断方向就可以了。虽然数据范围大了一点,但是这道题显然是可以采用记忆化搜索的方式进行优化的,加了记忆化,然后还有一个判断步数的剪枝,应该问题不大

简单的动归。。。。。程序自己写吧。。。。
N2也能过的