題意
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,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)
思路:
1.使用了bfs演算法,對於乙個位置,找出它可以去的方向,此時有兩個陣列,乙個是a陣列是迷宮邊界,另乙個是visit陣列用來判斷這個位置之前是否有到達過。2.使用了佇列的資料結構,對於乙個位置,將他所有可到達的位置壓入隊尾中,然後在彈出隊首判斷所有可到達的位置壓入佇列中,直到隊列為空或者已經到達目的地位置。3.輸出到達目的的路勁,採用了乙個陣列frontpoint用來記錄,此頂點的前乙個頂點,由此可知到達此節點之前的前乙個位置在哪,採用遞迴思路,最後輸出路徑。
**:
#include
#include
#include
#include
using
namespace std;
int a[5]
[5];
bool visit[5]
[5];
struct point
;int x;
int y;
point
(int x1,
int y1):x
(x1),y
(y1)};
point frontpoint[5]
[5];
int dx=
;int dy=
;queue q;
void
bfs()}
}}void
output
(point z[
5],int x,
int y)
}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
**思路:**倒水的問題,是圖的一種,隱式圖,每個狀態對應圖中的乙個節點,所以考慮到這個「圖」問題,我們可以用廣度搜尋的辦法來解決問題。
1.使用map; mapvisit是與迷宮visit陣列一樣的功能來記錄是否到達過這個狀態,mapfrom是用來記錄為了到達此狀態所做的動作,便於輸出;mapfrom2是用來記錄到達此狀態前乙個狀態是什麼。
2.因為用bfs用了佇列的資料結構,每次訪問隊首元素,彈出隊首,再把隊首元素可到達的狀態都加入隊尾中,直到隊列為空或者有乙個杯子達到題目要求
3.輸出的方法採用的是遞迴的思想。
**:
#include
#include
#include
#include
#include
using
namespace std;
int a,b,c;
struct status
;int a;
int b;
status
(int a1,
int b1)
bool
operator
<
(const status &p)
const
status filla()
status fillb()
status afillb()
status bfilla()
status emptya()
status emptyb()
};mapbool
>visit;
map from;
mapfrom2;
//用來記錄前乙個節點狀態
queue q;
void
output
(status t)
}void
bfs(
int a,
int b)
status s0 = s1.
afillb()
;if(visit[s0]==0
) s0 = s1.
bfilla()
;if(visit[s0]==0
) s0 = s1.
emptya()
;if(visit[s0]==0
) s0 = s1.
emptyb()
;if(visit[s0]==0
) s0 = s1.
filla()
;if(visit[s0]==0
) s0 = s1.
fillb()
;if(visit[s0]==0
)}}int
main()
return0;
}
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...
程式設計思維Week2 作業
輸入乙個5x5的二維陣列由0 1組成,表示法陣地圖。地圖顯示,0表示可以走,1表示不可以走,左上角是起點,右下角是終點,這兩個位置保證為0。編寫程式,找到起點到終點的最短路線。要求輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標。資料保證有唯一解。該題是典型的bfs演算法應用。由於題目要求輸...
SDU程式設計作業Week2
b pour water 本題多解 輸出一種即可 1.本題是一道迷宮題因此採用寬搜的方法進行對地圖的遍歷 佇列實現 2.由於需要輸出路徑因此我們記錄從開始到達每乙個節點需要多少步,最後只需要按照步數的逆就可以輸出路徑 利用路徑矩陣 其中也包含了地圖的其他資訊 如牆 3.如何加入節點,每個節點 附近 ...