第一周作業 迷宮

2021-10-03 08:21:35 字數 2484 閱讀 9654

題目描述:

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

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

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

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)

題目思路:

對於迷宮問題,我們的思路是利用佇列這一資料結構,類似於層次遍歷,首先將起點放入佇列中,然後檢視四周四個點能否到達(到達的條件是周圍的點不能超出邊界和不能碰到障礙物也就是牆),如果能夠到達那就把四周的點加入到佇列中。此時起點已經走過,在佇列中將其刪除。為了防止走迷宮時再走回來,所以我們把經歷過的地方放置障礙物,如此反覆進行直到到達終點為止。

對於這個問題而言,如果僅僅利用課上的**是不夠的,因為上面的思路並沒有解決乙個問題:如果走迷宮走到了死路,那麼我們的路徑如何確定?這些沒有通往終點的路徑依然加入了佇列中,但是輸出的時候並沒有刪除它們,所以如果按照課上的**會出現如下情況:

可以很明顯的看到,有一些點並不是由左上角的起點到右下角的終點所途徑的道路,如(4,0)和(4,2),周圍的點(3,0)和(3,2)進入到佇列中時發現(4,0)和(4,2)都是可以到達的點,但是到達這些點之後發現再走就是死路了,所以我們要考慮如何把不是終點的路徑刪除,所以我們在佇列中要加入另乙個引數,這個引數就是記錄到達這個點的後乙個點的座標

typedef

struct

sqqueue;

其中pre指的就是到達這個點的後乙個點的座標,這樣到達終點的時候就可以記錄下每個點前後的點,順著路徑輸出就可以得到結果。對於沒有到達終點的路徑,因為輸出的時候沒有走這個點,所以就不會輸出。

for

(int i=front;i>

0;i=qu[i]

.pre)

return

true

;

**如下:

#include

#define maxsize 100

#define m 5

#define n 5

using

namespace std;

typedef

struct

sqqueue;

sqqueue qu[maxsize]

;//建立佇列

int front=

0,rear=0;

int mg[m+2]

[n+2]=

,/*這裡我們將周圍用1封鎖住,實際上可以不用1封鎖,*/

,/*直接在判斷的時候判斷點的橫縱座標是否越界即可*/,,

,,};

intmain()

}int xi=m;

//終點橫座標

int yi=n;

//終點縱座標

int xe=1;

//起點橫座標

int ye=1;

//起點縱座標

int i, j, di, i1, j1;

rear++

;//隊尾引數設定

qu[rear]

.i=xi;

qu[rear]

.j=yi;

qu[rear]

.pre=-1

;//走到終點之後就終止了,終點後面沒有點

mg[xi]

[yi]=-

1;//終點標記已經走過

while

(front!=rear)

//其實就是佇列非空

//注意輸出格式逗號後面有空格

break;}

for(di=

0;di<

4;di++)if

(mg[i1]

[j1]==0

)//如果能走就往下走}}

return0;

}

執行結果:

第一周作業

專案shrinkwrap games operating systems 這些軟體是怎麼說服你 陌生人 成為他們的使用者的?他們的目標都是盈利麼?通過廣告 老使用者口碑推薦 實體店推薦等方式發展新使用者,目標一般是盈利的,賺取使用者現金。通過廣告 老使用者口碑推薦等方式發展新使用者,目標一般是盈利的...

第一周作業

我的乙個小目標 7月13下午15.58分,我不遠千里踏上了北上求學謀生之路 年近快30歲的我深深的感到了孔子所謂的男人三十而立的壓力,從小到大父母對我的要求和期望都比較大,而我總是讓他們失望,一直都是一事無成,有的時候我都在質問自己甚至心中還有一絲幻想,如果時光能倒退從來我以前一定好好學習,考乙個好...

第一周作業

1 常見linux的發行版有哪些?並描述不同發行版之間的聯絡與區別 主要分redhat系列和debian系列。不同發行版本之間的區別是包管理工具的不同 redhat系列 redhat centos,fedora debian系列 linux mint ubuntu,debian gnu linux ...