SDU程式設計作業Week2

2021-10-03 12:31:09 字數 4380 閱讀 9236

b - pour water(本題多解 輸出一種即可)

)

1.本題是一道迷宮題因此採用寬搜的方法進行對地圖的遍歷(佇列實現)

2.由於需要輸出路徑因此我們記錄從開始到達每乙個節點需要多少步,最後只需要按照步數的逆就可以輸出路徑(利用路徑矩陣 其中也包含了地圖的其他資訊 如牆)

3.如何加入節點,每個節點「附近」有四個方向可走我們只需要依次判斷這些節點的合法性就可以判斷是否加入佇列

4.判斷是否可走依據:

1)不超過地圖邊界

2)沒有到達過(初始化為-1 表示未到達過)

3)沒有穿牆術(牆標記為-2)

5.實際上也可以加上到達終點後返回

#include

#include

using

namespace std;

const

int m =

5,n =5;

int m[m]

[n];

//m*n

void

read()

else}}

struct p};

queue

que;

int dx=

;//四個方向

1.本題如果將水量看作一種狀態,可以發現它的變化是乙個狀態到另乙個狀態的改變,對於這種題目我們可以想到利用寬搜的方法去遍歷它的所有狀態。

2.本題有ab兩個水杯我們可以把他們的水量看作乙個二維座標,利用佇列去儲存這些狀態

3.由於需要輸出過程(路徑),本題我採用了乙個map(from)去記錄每種狀態的**狀態以及對應的操作(利用結構體儲存)

4.狀態如何變化:

每種狀態分別有六種變化:

1)a倒空

2)b倒空

3)a倒滿

4)b倒滿

5)a倒入b(又分為兩種小狀態 a全部被倒入b ; a倒滿b有剩餘)

6)b倒入a(同樣兩種小狀態 b全部被倒入a ; b倒滿a有剩餘)

5.如何加入:每種狀態我們需要判斷它的合法性才能判斷是否加入佇列,並在from中加入這種狀態

6.合法性判斷:

1)此狀態未到達過

2)沒有出現最終結果

7.結果的輸出:利用遞迴從from中依次調出每次狀態的變化並輸出。

#include

#include

#include

#include

using

namespace std;

const

int maxa =

1005

,maxb =

1005

;int mark[maxa]

[maxb]

;void

init

(int a,

int b)

struct state

;struct p};

map from;

//記錄某乙個狀態的上一步 狀態a來自狀態b

queue

que;

void

ins(state fro,p current)

}void

output

(p current)

p go =

;output

(go)

; cout<

}void

water

(int a,

int b,

int c)

; state fro;

que.

push

(current)

;while

(!que.

empty()

);current =

;ins

(fro,current);if

(current.a == c||current.b == c)

}//倒空b

if(now.b!=

0&&mark[now.a][0

]==0)

; current =

;ins

(fro,current);if

(current.a == c||current.b == c)

}//倒滿a

if(now.a!=a&&mark[a]

[now.b]==0

);current =

;ins

(fro,current);if

(current.a == c||current.b == c)

}//倒滿b

if(now.b!=b&&mark[now.a]

[b]==0)

; current =

;ins

(fro,current);if

(current.a == c||current.b == c)

}//a倒b

if(now.a!=0)

;if(now.a+now.b<=b&&mark[0]

[now.a+now.b]==0

);}else

if(mark[now.a-

(b-now.b)

][b]==0

);}ins

(fro,current);if

(current.a == c||current.b == c)

}//b倒a

if(now.b!=0)

;if(now.a+now.b<=a&&mark[now.a+now.b][0

]==0)

;}else

if(mark[a]

[now.b-

(a-now.a)]==

0);}

ins(fro,current);if

(current.a == c||current.b == c)}}

cout<<

"success\n";}

intmain()

return0;

}

程式設計 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...

程式設計思維Week2 作業

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