洛谷P1301 魔鬼之城 題解

2022-06-02 06:30:15 字數 2619 閱讀 5087

想找原題這裡:傳送門

題目描述

在乙個被分割為n*m個正方形房間的矩形魔鬼之城中,乙個探險者必須遵循下列規則才能跳躍行動。他必須從(1, 1

)進入,從(n, m)走出;在每一房間的牆壁上都寫了乙個魔法數字,是1~13之內的自然數;探險者可以想像出8個方向中的任何乙個(水平或垂直或對角線方向),隨後他就可以作一次空間跳躍穿過這一方向上的連續的x個房間,其中x是他原來所在房間的魔法數字。但如果在這一方向上的房間數小於x,則他不作任何跳躍,而必須想像另乙個方向。同時,探險者不能作連續兩次相同方向的跳躍。

例如在上圖的5*4的魔鬼之城中,如果探險者現在所在的位置是(3, 3),那麼通過依次空間跳躍他可以到達下列房間中的乙個:(1, 1),(3, 1),(1, 3),(5, 1),或(5, 3)。另外,如果他要用兩次跳躍從(5, 4)到達(3, 2),則他不能首先跳到(4, 3)(因為這樣他第二次跳躍的方向將和第一次相同,而這是不允許的)。所以他必須先跳躍到(2, 1

)。請你寫乙個程式,對給定的地圖,算出探險者至少需要跳躍多少步才能離開魔鬼之城。

輸入格式

一行給出n,m(都不超過100);

下來有m行,每行為n個自然數,表示對應房間中的魔法數字。

輸出格式

出最小步數,如果探險者無法離開魔鬼之城,請輸出「never」。

輸入輸出樣例

輸入 #1複製54

3367

11321

1332

2112

1221

輸出 #1複製

4

這道題乍一看跟迷宮最短路徑問題很相似所以初步印象首選bfs,然後我們做進一步分析:

我們經過分析又得知兩次不可能連續走同一方向,所以我們在進行bfs時還需要定義一變數記錄上一步跳躍方向以防止連續兩次方向相同。

我們經過分析又得知如果同乙個點在bfs過程中被訪問了兩次相同方向,那麼這一行為必定是沒有貢獻的(相當於走了一遍走過的路所以也就不需要重新走一遍了)

所以基於上述分析我們可得知我們可以對每乙個點的八個不同方向建立bool陣列來記錄是否被訪問過。

**實現:

1 #include2

using

namespace

std;

3int

n,m;

4int a[105][105];5

bool b[105][105][11];6

int ans=-1;7

int t; //

多少步

8int vis; //

多少個格仔被訪問

9int v; //

這乙個格仔上的數

10struct

node;

15node tmp;

16 queue < pairint> >q;

17void bfs(int xx,int

yy),0

));19

while(!q.empty())

24if(b[tmp.x][tmp.y][tmp.direct]) continue

;25 b[tmp.x][tmp.y][tmp.direct]=true

;26 vis++;

27 v=a[tmp.x][tmp.y];

28if(tmp.x-v>=1

),t+1

));31 vis++;32}

33if(tmp.y+v<=m&&!b[tmp.x-v][tmp.y+v][3]&&tmp.direct!=3

),t+1

));35 vis++;36}

37if(!b[tmp.x-v][tmp.y][2]&&tmp.direct!=2

),t+1

));39 vis++;40}

41}42if(tmp.x+v<=n),t+1

));45 vis++;46}

47if(tmp.y-v>=1&&!b[tmp.x+v][tmp.y-v][7]&&tmp.direct!=7

),t+1

));49 vis++;50}

51if(!b[tmp.x+v][tmp.y][6]&&tmp.direct!=6

),t+1

));53 vis++;54}

55}56if(tmp.y-v>=1&&!b[tmp.x][tmp.y-v][8]&&tmp.direct!=8

),t+1

));58 vis++;59}

60if(tmp.y+v<=m&&!b[tmp.x][tmp.y+v][4]&&tmp.direct!=4

),t+1

));62 vis++;63}

64}65return;66

}

67int

main()73}

74 bfs(1,1

);75

if(ans>0)78

else

81return0;

82 }

洛谷P1301 魔鬼之城

一道廣度優先搜尋的題目。結構體含義 struct node 方向的標號受上面定義的 dx dy 陣列 的影響 這個題要注意的就是初始化起點的問題。起點可以向右 右下 下三個方向,所以三個方向我們都需要處理併入隊。include include include include include usin...

P1301 魔鬼之城

在乙個被分割為n m個正方形房間的矩形魔鬼之城中,乙個探險者必須遵循下列規則才能跳躍行動。他必須從 1,1 進入,從 n,m 走出 在每一房間的牆壁上都寫了乙個魔法數字,是1 13之內的自然數 探險者可以想像出8個方向中的任何乙個 水平或垂直或對角線方向 隨後他就可以作一次空間跳躍穿過這一方向上的連...

洛谷 P1101 題解

這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...