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

2021-10-03 13:56:32 字數 3863 閱讀 4725

b題——倒水問題(bfs)

東東有一張地圖,想通過地圖找到妹紙。地圖顯示,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)

每個點用pair結構儲存,用二維陣列a儲存迷宮的結構,同樣的vist陣列儲存是否訪問過該點,dx與dy儲存x、y方向的對應偏移量(寬度為1),乙個點加上兩軸偏移量為它的鄰接點。

從起點(0,0)開始,向四周鄰接點擴寬,如果未訪問該點且為放置障礙物,則該點入隊並標記已訪問。

再按照佇列中的次序按上述規則訪問,每次訪問完彈出,直到到達終點(4,4)或佇列空(不存在路徑從起點到終點)。

要輸出路徑經過的點,可以設定乙個map,pair>型的陣列path1,序號為該點,對應值為該點在最終路徑上連線的前乙個點。此時可以採用回溯的方式,從終點一直回溯到起點入棧s,這樣可以避免多餘點的輸出。最後從棧s中一一輸出彈出點,即為最終的路徑。

一開始用回溯的方法取出的順序是從終點到起點,這時棧的作用在於自然將輸出順序變為起點到終點。注意map的使用,同型別的對映可以進行回溯。

#

include

#include

#include

#include

using

namespace std;

bool visit[5]

[5];

//用來記錄是否到達該點

int a[5]

[5];

//儲存迷宮

int dis;

int dx=

;//乙個點的鄰近點偏移量

int dy=

; queueint,

int>

> q;

mapint,

int>

,pair<

int,

int>

> path1;

stackint,

int>

> s;

void

bfs()if

((thex==

4&&they==5)

||(thex==

5&&they==4)

)//到達終點則退出迴圈

break;}

} pair<

int,

int> rear=end;

s.push

(rear)

;while

(rear!=start)

}//輸入迷宮陣型

void

design()

}}void

show()

}int

main()

倒水問題 「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

跟上一題類似,從一開始的兩個空杯到最終的(xx,c)或(c,yy),對於每種操作都可以看做是一種狀態(點)到達另一種狀態(點)的偏移量。status結構體作為一種狀態,儲存兩個杯子分別的裝水量,設定map的對映關係,儲存一種狀態是否存在過的情況,設定map的對映關係,儲存末狀態對應的始狀態(前一種狀態,不是初始狀態)。就可以用遞迴的方式進行回溯輸出,在判斷輸出什麼操作字串時,用了一種比較暴力的方法,將這種狀態與map中對應的始狀態進行運算比較,由此推斷出由始狀態到末狀態的操作是什麼。

需要回溯時,map是乙個好幫手。本來想以狀態對映字串的形式來判斷操作並輸出,但試了發現餘力不足,還是回到了簡單的運算判斷。

#

include

#include

#include

using

namespace std;

int a,b,c;

struct

status

status

(int aa,

int bb)

bool

operator

<

(const status &x)

const

bool

operator==(

const status &x)

const};

queue q;

mapbool

> achieve;

map way;

void

show

(status t)

}void

bfs()

status emptya(0

,current.b)

,emptyb

(current.a,0)

,filla

(a,current.b)

,fillb

(current.a,b)

,atob

(max

((current.a+current.b-b),0

),min(b,current.a+current.b)),

btoa

(min

(a,current.a+current.b)

,max

((current.a+current.b-a),0

));if

(!achieve[emptya])if

(!achieve[emptyb])if

(!achieve[filla])if

(!achieve[fillb])if

(!achieve[atob])if

(!achieve[btoa])}

}int

main()

return0;

}

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

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

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

這周作業主要是對廣度優先搜尋bfs的應用,包括求最短路徑的迷宮問題及隱式圖問題 倒水問題。東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路...

程式設計思維Week2 作業

輸入乙個5x5的二維陣列由0 1組成,表示法陣地圖。地圖顯示,0表示可以走,1表示不可以走,左上角是起點,右下角是終點,這兩個位置保證為0。編寫程式,找到起點到終點的最短路線。要求輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標。資料保證有唯一解。該題是典型的bfs演算法應用。由於題目要求輸...