week2作業題 bfs迷宮問題 bfs倒水問題

2021-10-03 13:41:58 字數 4318 閱讀 9151

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

input: 輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。

output:輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。

sample input:

0 1 0 0 0

0 1 0 1 0

0 1 0 1 0

0 0 0 1 0

0 1 0 1 0

sample output:

(0, 0)

(1, 0)

(2, 0)

(3, 0)

(3, 1)

(3, 2)

(2, 2)

(1, 2)

(0, 2)

(0, 3)

(0, 4)

(1, 4)

(2, 4)

(3, 4)

(4,4)

hint:

座標(x, y)表示第x行第y列,行、列的編號從0開始,且以左上角為原點。 另外注意,輸出中分隔座標的逗號後面應當有乙個空格。

在該題目中可以使用bfs從起點搜尋,如果能夠搜尋到終點就說明存在起點到終點的路徑。在使用bfs搜尋的時候,我們需要找到現在搜尋到的點的所有未到達的鄰接點。在迷宮中,它的鄰接點就是上下左右的最多四個點,如果鄰接點存在並且未到達(即為0)則將該鄰接點加入佇列,並將它相應的位置置為1,標記為已到達。為了方邊查詢上下左右的鄰接點,定義了座標變化的dx和dy兩個陣列。

const

int dx=

;//上下左右

const

int dy=

;//上下左右

為了能夠確定起點到終點的路徑,我將每個點的座標和它的前乙個到達它的點的座標用乙個結構體物件儲存,即定義了結構體型別path。這樣我們就可以確定路徑。

struct path
最後我們可以使用遞迴的方法輸出路徑(當然也可以使用迭代的方法)。

#include

#include

#include

#include

using

namespace std;

struct pathpath[5]

[5];

int maze[5]

[5];

//記錄迷宮

const

int dx=

;//上下左右

const

int dy=

;//上下左右

void

bfs(

int a =0,

int b =0)

}}}}

void

findpath

(int x,

int y)

//輸出路徑

intmain()

}bfs()

;findpath(4

,4);

}

倒水問題"fill a" 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。

input:輸入包含多組資料。每組資料輸入 a, b, c 資料範圍 0 < a <= b 、c <= b <=1000 、a和b互質。

output:你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。

sample input:

2 7 5

2 7 4

sample output:

fill b

pour b a

success

fill a

pour a b

fill a

pour a b

success

notes:

如果你的輸出與sample output不同,那沒關係。對於某個"a b c"本題的答案是多解的,不能通過標準的文字對比來判定你程式的正確與否。

所以本題由 spj(special judge)程式來判定你寫的**是否正確。

在這個題目中可以把a,b兩個水杯的狀態即水的量看作是隱示圖。從某乙個狀態經過一次倒水,得到的另乙個狀態就是該狀態的「鄰接點」。而倒水的情況總共分為六種情況:倒滿a,倒滿b,倒空a,倒空b,將a到入b中,將b倒入a中。每種狀態的「鄰接點」都是從該狀態經過上面六個變換中的一種得到的。在資料儲存的時候使用了status和pstatus兩種結構體型別,分別表示現在的狀態和倒水的前乙個狀態和倒水的方式。然後使用map儲存倒水的過程。

const string fa =

"fill a"

;//倒滿a

const string ea =

"empty a"

;//倒空a

const string pab =

"pour a b"

;//將a到入b中

const string fb =

"fill b"

;//倒滿b

const string eb =

"empty b"

;//倒空b

const string pba =

"pour b a"

;//將b倒入a中

struct status

struct pstatus

map mp;

//倒水的過程

從初始狀態也就是a = 0,b = 0開始,然後使用bfs搜尋,將每個可到達的並且未到達的狀態加入佇列中,一直到a = c或者b = c或者隊列為空結束。結果輸出是使用遞迴實現的。

#include

#include

#include

#include

#include

using

namespace std;

const string fa =

"fill a"

;//倒滿a

const string ea =

"empty a"

;//倒空a

const string pab =

"pour a b"

;//將a到入b中

const string fb =

"fill b"

;//倒滿b

const string eb =

"empty b"

;//倒空b

const string pba =

"pour b a"

;//將b倒入a中

struct status};

struct pstatus};

queue q;

map mp;

//倒水的過程

status bfs

(int a ,

int b ,

int c)

if(s.a < a)

//倒滿a }if

(s.b < b)

//倒滿b }if

(s.a >0)

//倒空a }if

(s.b >0)

//倒空b}if

(s.b >

0&& s.a < a)

//將b倒入a中

}else}}

if(s.a >

0&& s.b < b)

//將a倒入b中

}else}}

}return s;

}void

print

(status &s)

//輸出結果

intmain()

}

map的初始化是在c++11之後的版本才有的,之前的版本是沒有map的初始化的。

由於實驗中queue q和map mp都是全域性的,在每次開始一次的時候都要將其清空,否則就會出現之前的資料對後面的結果產生影響。

程式設計Week2作業題A 迷宮問題

題意 左上角是迷宮入口,右下角是迷宮出口,尋找從入口到出口的最短路徑並輸出最短路徑。輸入 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。輸出 輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。輸入樣例 0 1 0 0 0 0 1 0 1 0...

Week2 作業A 迷宮 bfs

輸入5 5矩陣,1表示牆,0表示可走。找出從左上角到右下角的最短路徑所經過的座標 輸入保證有唯一解 bool型二維陣列vis儲存輸入的01矩陣,1表示牆,0表示可走。map from儲存每乙個經過的座標的前驅結點座標。queue q儲存每一層擴充套件時的中心結點。為方便層層擴充套件時遍歷上下左右四個...

程式設計Week2作業題B 倒水問題

題意 給你兩個容器,容量分別為a,b 問是否能夠經過有限的步驟倒水,得到容量為 c 的水。輸入 輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。輸出 你的程式的輸出將由一系列的指令組成。這些輸出行將導致某乙個罐子 不指定是哪乙個罐子 正好包含c單位的水...