輸入5*5矩陣,1表示牆,0表示可走。找出從左上角到右下角的最短路徑所經過的座標(輸入保證有唯一解)
bool型二維陣列vis儲存輸入的01矩陣,1表示牆,0表示可走。map from儲存每乙個經過的座標的前驅結點座標。queue q儲存每一層擴充套件時的中心結點。為方便層層擴充套件時遍歷上下左右四個方向,定義陣列dx=,dy=。
初始化:將起點加入佇列
當佇列非空即還有待擴充套件的中心結點時(while迴圈):
取點:取出隊首結點
特判終點:判斷當前中心結點是否為終點,若是,輸出方案(==>後面補充print(point))
擴充套件結點:對上、下、左、右相鄰的結點,判斷合法性(1.不出邊界 2.不是牆 !vis[x][y] 3.沒到過 from.find(t)==from.end()),若合法,入佇列,將(合法的相鄰結點,中心結點)這一對映加入from。
輸出方案print(point):輸出以結點p為終點的最短路徑,因為從p到起點是逆序的,可採用兩種方法:①遞迴輸出:若當前結點是起點,輸出該點;若當前結點不是起點,將其前驅結點到起點的路徑輸出,再輸出當前結點 ②用vector將p到起點所經過的座標存起來,然後將vector倒序輸出
1.行列編號從0開始
2.輸出的特殊格式,每行中間有無空格,每行之間有無空行,結尾有無空行。
3.(0,0)是起點,最初加入時沒有前驅結點。在判斷合法性時,當使用條件from.find(t)==from.end()判斷是否到達過時,會把(0,0)判斷為沒有到達過,這樣就會給(0,0)製造乙個前驅結點。因此,在輸出方案時,遞迴判斷是否為起點,使用 「當前結點是否為(0,0)」 而不是 「from.find(t)==from.end()"
對於要求輸出方案的bfs,需要使用map儲存路徑,這樣,vis只需要承擔儲存牆的功能,可以用乙個bool型二維陣列。如果需要計數步數,可以在輸出路徑的過程中計數,也可以把vis改為int型陣列,在尋找路徑的過程計數。
**:
#include#include#include#includeusing namespace std;
struct point
point(){}
//比較
bool operator<(const point &p)const;
int dy=;
int m=5,n=5;//行數列數
void print(point &p)else
}void bfs(int sx,int sy,int tx,int ty)
//擴充套件結點
for(int i=0;i<4;i++)
} }}
int main()
} bfs(0,0,4,4);
return 0;
}
week2作業題 bfs迷宮問題 bfs倒水問題
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。outpu...
程式設計 Week2 作業
題意 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。ou...
Week2 程式設計作業
j x theta y 2 j 1 2 m sum j 直接按代價函式的公式敲 需新增的 temp0 theta 1 alpha m sum x theta y x 1 temp1 theta 2 alpha m sum x theta y x 2 theta temp0 temp1 要讓theta...