a802 最少轉彎問題

2021-09-28 10:07:29 字數 1124 閱讀 3888

time limit: 10 second

memory limit: 2 mb

問題描述

給出一張地圖,這張地圖被分為n*m(n,m<=100)個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的(x1,y1)這塊平地,問:你至少需要拐幾個彎才能到達目的地(x2,y2)?你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變(從水平垂直或從垂直到水平)次數

第1行: n m 第1至n+1行:整個地圖地形描述(0:空地;1:高山), 第2行地形描述為: 1 0 0 0 0 1 0 第3行地形描述為: 0 0 1 0 1 0 0 ......

s(即最少的拐彎次數)

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

【題解】

這題,用廣搜來做。

因為廣搜。可以按照轉彎1次,轉彎2次...的順序進行擴充套件節點。

因此先前已經走過的點一定不會再入隊一次。

可以用乙個cost[x][y]陣列,來記錄從起點到x,y座標的所需要的最少轉彎次數。

一開始cost[x][y]等於正無窮,然後cost[x0][y0] = 0,x0yo是起點座標。然後從x0,y0開始擴充套件節點。因為是以轉彎次數為花費。所以認定乙個方向之後可以一直走到頭。

然後我們每次到達乙個點,都遞增一次轉彎次數。這樣的結果就是,最後會多算了一次轉彎次數。最後減掉就可以了(擴充套件的話是4個方向定義兩個常量陣列就可以解決了)

【**】

#include #include struct po //用po結構體來記錄乙個點的座標 

;const int dx[5] = ; //表示往4個方向擴充套件

const int dy[5] = ;

int n,m,a[101][101],x1,y1,x2,y2,cost[101][101];

po dl[10010];

int main()

}

} }

} return 0;

}

最少轉彎問題

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