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