P1301 魔鬼之城

2022-08-24 20:18:08 字數 1448 閱讀 6721

在乙個被分割為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複製

5 4

3 3 6 7 11

3 2 1 1 3

3 2 2 1 1

2 1 2 2 1

輸出 #1複製

4

v[i][j][way]表示第i行第j列是其他點走way這個方向走來的。

還有v陣列應儲存從任一點走到這裡的最小步數。

#includeusing

namespace

std;

int mapa[105][105

];int v[105][105][10

];int dx[9]=;

int dy[9]=;

inline

intread()

ch=getchar();

}while(ch>='

0'&&ch<='9'

)

return s*w;

}struct

node;

queue

q;int

main()

}node start;

start.x=1,start.y=1

; start.step=0,start.way=9

; q.push(start);

while(!q.empty())

for(int i=1;i<=8;i++)}}

}printf(

"never");

}

洛谷P1301 魔鬼之城

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

洛谷P1301 魔鬼之城 題解

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

魔鬼細節之Java Programming

如果這個實體類要與實際網路進行互動,要實現 serializable介面 3.1父工程一般和聚工程合併,如 parent 3.2.父工程和聚合工程的區別 父工程 用來管理子工程的版本 聚合工程 統一管理子工程 在pom.xml檔案 中採用標籤管理所有的子類 4.在pom.xml中 的標籤的作用?管理...