給出一張地圖,這張地圖被分為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
【解題思路】
這是乙隻寬搜的經典題目,過程不多講,一定要判斷初始方向,不能一開始就轉向,剛開始就錯在這了。
1program
t4;2
const fx:array[1..4] of longint=(0,1,0,-1
);3 fy:array[1..4] of longint=(-1,0,1,0);4
var dt:array[1..100000,1..2] of
longint;
5 d,ans:array[1..100000] of
longint;
6 f:array[1..100,1..100] of
longint;
7 pd:array[1..100,1..100] of
longint;
8x1,x2,y1,y2,i,j,h,t,sum,n,m:longint;
9begin
10 filldword(pd,sizeof(pd) div
4,maxlongint div2);
11read(n,m);
12for i:=1
to n do
13for j:=1
to m do
read(f[i,j]);
14read(x1,y1,x2,y2);
15for i:=1to4
do16
begin
17if (x1+fx[i]>0) and(x1+fx[i]<=n) and(y1+fy[i]>0) and (y1+fy[i]<=n)
18and(f[x1+fx[i],y1+fy[i]]=0) then//重點在這
19begin
20inc(t);
21 dt[t,1]:=x1;
22 dt[t,2]:=y1;
23 d[t]:=i;
24end;25
end;
26while h<=t do
27begin
28inc(h);
29 sum:=1;30
while (dt[h,1]+fx[d[h]]*sum>0) and (dt[h,2]+fy[d[h]]*sum>0)31
and (dt[h,1]+fx[d[h]]*sum<=n) and (dt[h,2]+fy[d[h]]*sum<=m)
32and (f[dt[h,1]+fx[d[h]]*sum,dt[h,2]+fy[d[h]]*sum]<>1
)33 //and (not pd[dt[h,1]+fx[d[h]]*sum,dt[h,2]+fy[d[h]]*sum])
34do
35begin
36inc(t);
37 dt[t,1]:=dt[h,1]+fx[d[h]]*sum;
38 dt[t,2]:=dt[h,2]+fy[d[h]]*sum;
39 d[t]:=d[h];
40 ans[t]:=ans[h];41'
,dt[h,2]+fy[d[h]]*sum,''
,ans[t]);
42if (dt[h,1]+fx[d[h]]*sum=x2)and(dt[h,2]+fy[d[h]]*sum=y2) then
43begin
44writeln(ans[h]);
45halt;
46end;47
inc(sum);
48end;49
for i:=1to4
do50
if i mod
2<>d[h] mod
2then
51begin
52if (dt[h,1]+fx[i]>0) and (dt[h,2]+fy[i]>0) and
53 (dt[h,1]+fx[i]<=n) and (dt[h,2]+fy[i]<=m) and
54 (f[dt[h,1]+fx[i],dt[h,2]+fy[i]]<>1)55
then
56begin
57inc(t);
58 dt[t,1]:=dt[h,1]+fx[i];
59 dt[t,2]:=dt[h,2]+fy[i];
60 d[t]:=i;
61 ans[t]:=ans[h]+1
;62 //writeln(dt[h,1]+fx[i],'
',dt[h,2]+fy[i],'
',ans[t]);
63if (dt[h,1]+fx[i]=x2)and(dt[h,2]+fy[i] =y2) then
64begin
65writeln(ans[t]);
66halt;
67end;68
end;
69end;70
71end;72
end.
最少轉彎問題
給出一張地圖,這張地圖被分為n m n,m 100 個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的 x1,y1 這塊平地,問 你至少需要轉幾個彎才能到達目的地 x2,y2 你只能沿著水平和垂直方向的平地上行進,轉彎次數就等於行進方向的改變 從水平到垂直或從垂直到水平...
最少轉彎問題
給出一張地圖,這張地圖被分為n m n,m 100 個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的 x1,y1 這塊平地,問 你至少需要轉幾個彎才能到達目的地 x2,y2 你只能沿著水平和垂直方向的平地上行進,轉彎次數就等於行進方向的改變 從水平到垂直或從垂直到水平...
最少轉彎問題
題目描述 給出一張地圖,這張地圖被分為n m n,m 100 個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的 x1,y1 這塊平地,問 你至少需要拐幾個彎才能到達目的地 x2,y2 你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變 從水平到垂直或從...