題目描述:
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,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 ...