【题目描述】 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。 【输入格式】 第1行:n和m 第2至n+1行:整个地图地形描述,0为空地,1为高山 第n+2行:x1、y1、x2 、y2 ,分别为起点及终点坐标 【输出格式】 最少的拐弯次数 【样例输入】 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 【样例输出】 5 【分析】 广搜,每次向一个方向走,直到不能再走。
const dx:array[1..4]of longint=(0,0,-1,1); dy:array[1..4]of longint=(1,-1,0,0); var map,book:array[0..101,0..101]of longint; qx,qy,qs:array[0..10001]of longint; i,j,n,m,x1,y1,x2,y2,head,tail,x,y:longint; begin read(n,m); for i:=1 to n do for j:=1 to m do read(map[i,j]); read(x1,y1,x2,y2); head:=1;tail:=1; qx[1]:=x1; qy[1]:=y1; qs[1]:=0; fillchar(book,sizeof(book),0); book[x1,y1]:=1; while head<=tail do begin for i:=1 to 4 do begin x:=qx[head]+dx[i]; y:=qy[head]+dy[i]; if (x=x2)and(y=y2) then begin write(qs[head]); exit; end; while (x>=1)and(x<=n)and(y>=1)and(y<=m)and(book[x,y]=0)and(map[x,y]=0) do begin inc(tail); qx[tail]:=x; qy[tail]:=y; qs[tail]:=qs[head]+1; book[x,y]:=1; x:=x+dx[i]; y:=y+dy[i]; end; end; inc(head); end; end.转载于:https://www.cnblogs.com/JRX2015U43/p/6533548.html
相关资源:JAVA上百实例源码以及开源项目