b題——倒水問題(bfs)
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。
input
輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。
output
輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。
sample input
sample output0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0
0 1 0 1 0
每個點用pair結構儲存,用二維陣列a儲存迷宮的結構,同樣的vist陣列儲存是否訪問過該點,dx與dy儲存x、y方向的對應偏移量(寬度為1),乙個點加上兩軸偏移量為它的鄰接點。(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)
從起點(0,0)開始,向四周鄰接點擴寬,如果未訪問該點且為放置障礙物,則該點入隊並標記已訪問。
再按照佇列中的次序按上述規則訪問,每次訪問完彈出,直到到達終點(4,4)或佇列空(不存在路徑從起點到終點)。
要輸出路徑經過的點,可以設定乙個map,pair>型的陣列path1,序號為該點,對應值為該點在最終路徑上連線的前乙個點。此時可以採用回溯的方式,從終點一直回溯到起點入棧s,這樣可以避免多餘點的輸出。最後從棧s中一一輸出彈出點,即為最終的路徑。
一開始用回溯的方法取出的順序是從終點到起點,這時棧的作用在於自然將輸出順序變為起點到終點。注意map的使用,同型別的對映可以進行回溯。
倒水問題 「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。#
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()
input
輸入包含多組資料。每組資料輸入 a, b, c 資料範圍 0 < a <= b 、c <= b <=1000 、a和b互質。
output
你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。
sample input
sample output2 7 5
2 7 4
跟上一題類似,從一開始的兩個空杯到最終的(xx,c)或(c,yy),對於每種操作都可以看做是一種狀態(點)到達另一種狀態(點)的偏移量。status結構體作為一種狀態,儲存兩個杯子分別的裝水量,設定map的對映關係,儲存一種狀態是否存在過的情況,設定map的對映關係,儲存末狀態對應的始狀態(前一種狀態,不是初始狀態)。就可以用遞迴的方式進行回溯輸出,在判斷輸出什麼操作字串時,用了一種比較暴力的方法,將這種狀態與map中對應的始狀態進行運算比較,由此推斷出由始狀態到末狀態的操作是什麼。fill b
pour b a
success
fill a
pour a b
fill a
pour a b
success
需要回溯時,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演算法應用。由於題目要求輸...