最少轉彎問題

2022-05-14 05:43:23 字數 3373 閱讀 1368

給出一張地圖,這張地圖被分為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

【解題思路】

這是乙隻寬搜的經典題目,過程不多講,一定要判斷初始方向,不能一開始就轉向,剛開始就錯在這了。

1

program

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 你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變 從水平到垂直或從...