程式設計思維Week2 作業

2021-10-03 12:08:18 字數 2470 閱讀 5055

輸入乙個5x5的二維陣列由0、1組成,表示法陣地圖。地圖顯示,0表示可以走,1表示不可以走,左上角是起點,右下角是終點,這兩個位置保證為0。編寫程式,找到起點到終點的最短路線。

要求輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標。資料保證有唯一解。

該題是典型的bfs演算法應用。由於題目要求輸出最短路徑依次經過的座標,需要定義乙個point類的path陣列用於記錄路徑,vis陣列用於記錄某個點是否已經遍歷到。在擴充套件過程中,每個點可以向上下左右四個方向進行擴充套件,但這裡需要注意的是,在bfs過程中並不是每乙個遍歷到的點都是在最短路徑上的,因此在定義point類時,需要額外的pre用於記錄到達該點的路徑上它之前的那個點在path陣列中的位置。

不停地進行擴充套件直到遇到終點,利用終點的pre向前遞迴找到最短路徑並輸出座標。

該題屬於bfs演算法的簡單變形,需要熟練掌握bfs的基本結構。

需要注意的是:

bfs的擴充套件是遍歷了所有可到達的點,但很多其他點並不在兩點間的最短路徑上,因此記錄到這些點時應回溯到他之前的那個點。

對每個點在path陣列中的位置確定,需要front、end,front用於確定該點之前的點的位置,end用於記錄該點在陣列中的位置

遍歷的判斷條件:座標不應超出5x5且可到達而還未遍歷到的點。遍歷到終點後及時停止擴充套件。

#include

#include

using

namespace std;

bool vis[5]

[5];

int a[5]

[5];

struct point

point

(int a,

int b)

point

(int a,

int b,

int p)};

queue q;

int dx=

;int dy=

;point path[25]

;//回溯

void

print

(point n)

void

bfs(

)//int count = 0;

for(

int i =

0; i <4;

++i)}}

}int

main()

bfs();

}

倒水問題:兩個水杯,最大容量分別為a和b,起始兩個水杯中都是空的,我們希望通過一系列操作得到容量為c的水。操作僅限於: 倒滿a/b杯,倒空a/b杯,把a的水倒到b中或反之。

要求輸出獲得c體積水的每乙個操作,「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。直到獲得c體積的水,輸出「success」。

ps:本題答案可能存在多解

由於題目要求輸出每步操作,因此我們需要自定義status類,其中包括具體操作對應的序號以及本次操作後a和b杯中水的體積。類似於迷宮問題,我們可以把從起始狀態到獲得容量為c的水的一系列操作看成一條路徑,即我們需要找到一條可以成功到達終點的路徑,而路徑可能有多條,所以可以使用bfs演算法進行擴充套件,擴充套件方向為幾種不同的操作。而同樣,並不是擴充套件出的每一步操作都可以最終獲得想要的結果,因此需要map類的from陣列記錄每乙個狀態與前乙個狀態的對應關係。

在擴充套件過程中使用佇列進行bfs,根據不同的操作進行討論直到獲得想要的結果。再根據from陣列遞迴至起始狀態根據操作序號輸出具體操作。

該題屬於隱式圖問題,同樣可以用bfs擴充套件,需要熟練掌握bfs的基本結構。

需要注意的點:

對於每一種狀態來說只對應一種前狀態,即在map類中該狀態作為key不可對應多個value

並不是每一種狀態最終都可以獲得想要的結果,因此在遇到這些狀態時應回溯到他之前的點然後繼續其他的擴充套件,即擯棄無用的操作。

#include

#include

#include

#include

using

namespace std;

struct status};

queue q;

map from;

void

print

(status &s)

void

refresh

(status &s, status &t)

}void

bfs(

int a,

int b,

int c)

//倒空a的水

if(s.a >0)

//倒空b的水

if(s.b >0)

//續滿a

if(s.a < a)

else}}

//續滿b

if(s.b < b)

else}}

}//printf("-1/n");

}int

main()

return0;

}

程式設計思維與實踐 Week2 作業

b題 倒水問題 bfs 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,...

程式設計思維與實踐 Week2 作業

b pour water 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。輸入 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示...

程式設計 Week2 作業

題意 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。ou...