TopCoder

User's AC Ratio

87.5% (7/8)

Submission's AC Ratio

58.3% (7/12)

Tags

Description

你走過迷宮嗎?在一個複雜的地圖裡面,試圖摸索出走到出口的路線就是遊玩迷宮的目標。但你知道只要迷宮的結構夠簡單的話,是存在一套必勝法則的嗎?

這套必勝法則又被稱做「右手法則」,首先在進入地圖後,我們可以先把右手扶在牆上,接著只需要不斷地讓貼著牆壁行走,就會奇蹟似地抵達出口。

右手法則的解說圖,參考自維基百科

若要以程式的角度做解釋的話,我們可以假設迷宮是一張 $N\times M$ 的表格,其中起點在 $(1, 2)$、終點在 $(N, M - 1)$。玩家一開始從 $(1, 2)$ 進入後,面向的方向會是 $(+1, 0)$,並將右手扶在 $(1, 1)$ 的牆壁上。接著,不斷進行以下過程:

  1. 若面向的方向遇到牆壁時,直接左轉並重新執行 i.。
  2. 前進一步。
  3. 若右手離開牆壁,直接右轉再前進一步,並回到 i.。

而根據當前的面向方向,右轉或左轉後面向的方向則是依據下列的關係圖:

$$
(+1, 0) \xrightleftharpoons[\text{左轉}]{\text{右轉}} (0, -1) \xrightleftharpoons[\text{左轉}]{\text{右轉}} (-1, 0) \xrightleftharpoons[\text{左轉}]{\text{右轉}} (0, +1) \xrightleftharpoons[\text{左轉}]{\text{右轉}} (+1, 0)
$$

現在,請你撰寫一支程式,在輸入迷宮地圖的長相後,輸出從起點 $(1, 2)$ 靠著右手法則走到終點 $(N, M - 1)$ 所需要的移動步數。請注意,左右轉並不算在步數內。

Input Format

輸入首行有兩個正整數 $N, M$,代表迷宮的長與寬。

接下來 $N$ 行,每行一個長度為 $M$ 的字串,皆由字元 .# 組成,其中我們以 . 當作空地、# 當作牆壁。

  • $3\leq N, M\leq 200$
  • 保證給定的迷宮地圖外圍除了 $(1, 2)$ 和 $(N, M - 1)$ 外皆為牆壁(#
  • 保證給定的迷宮地圖滿足 $(1, 2)$ 和 $(N, M - 1)$ 皆為空地 (.)
  • 保證給定的迷宮可以全程遵照右手法則走到出口

Output Format

輸出一個數字,代表使用右手法則從 $(1, 2)$ 走到 $(N, M - 1)$ 的所需步數。

Sample Input 1

4 4
#.##
#..#
##.#
##.#

Sample Output 1

4

Sample Input 2

5 8
#.######
#..#.#.#
##...#.#
#......#
######.#

Sample Output 2

11

Hints

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0~1 範例測資 0
2 0~11 無額外限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 524288 65536 1 2
1 1000 524288 65536 1 2
2 1000 524288 65536 2
3 1000 524288 65536 2
4 1000 524288 65536 2
5 1000 524288 65536 2
6 1000 524288 65536 2
7 1000 524288 65536 2
8 1000 524288 65536 2
9 1000 524288 65536 2
10 1000 524288 65536 2
11 1000 524288 65536 2