星流萤
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

即便「假面愚者」也会严肃地歌颂他们追随的星神——因为祂永远不会放弃你,永远不会令你沮丧,永远不会抛弃你,永远不会让你哭,永远不会同你道别,永远不会用谎言伤害你。


艾斯·里克利,艾普瑟隆 Ⅻ 星系流行巨星


在"黄金的时刻",爱德华医生的梦境贩售店总是门庭若市。此刻,他正向星和流萤推销一枚特殊的梦泡:"我想您一定会喜欢这枚梦泡。它来自私人匿名捐赠,据说其中的记忆……属于一位星神!我可以向您保证,这绝对是独一无二的体验。"


星再次睁开眼时,失重感瞬间袭来,随即狠狠地摔在了地上。好在梦境中没有痛觉,但同行的流萤却不见踪影。环顾四周,星发现自己身处一座光怪陆离的迷宫之中。


这里的空气似乎充满了粘稠的"忆质",如同深潜于万米水下,周遭充满了高阻尼的流体感。 顺势而行尚且轻松,但每一次试图改变前进方向,都仿佛要对抗巨大的流体阻力,极大地消耗体力和时间。为了尽快与流萤汇合,星必须规划出一条转向次数最少的路径,以最高的效率穿过迷宫。



世界之外的你决定协助星突破这层梦境。


形式化地,我们将迷宫视为一个 nm 列的网格地图。地图中分布着若干不可通行的障碍物地块,其余为平地。 星的起始位置位于迷宫左上角 (1, 1),流萤位于右下角 (n, m)


  1. 最开始星位于 (1, 1),此时初始朝向未定。她迈出的第一步将决定她的初始前进方向,且这一步不计入转向次数。


  2. 当星处于某个地块时,她可以选择沿当前前进方向继续移动到相邻的非障碍地块,这种移动顺应惯性,不增加转向计数。


  3. 星可以选择向当前方向的左侧或右侧(即旋转 90^\circ)移动到相邻地块。由于克服流体阻力,该行为被记为一次转向


  4. 星不会进行掉头(即旋转 180^\circ),并且星可以以任意前进方向一次或多次经过同一非障碍地块。


请你计算出星从 (1, 1) 移动到 (n, m) 所需的最少转向次数。

输入描述:

第一行输入两个整数 \textstyle n, m \ (2 \leq n, m \leq 2 \times 10^3)


接下来 n 行,每行输入 m 个字符(仅由 ‘0’ 和 ‘1’ 构成,字符间用空格分隔),表示迷宫中地块的状态。对于第 i 行,第 j 列,如下所述:


  1. ‘0’ 表示格子 (i,j) 可通行,没有障碍;


  2. ‘1’ 表示格子 (i,j) 存在障碍物,不可通行;


保证迷宫至少存在一条路径使得星能够从 (1, 1) 走到 (n, m)

输出描述:

输出一行一个整数,表示从 (1, 1) 移动到 (n, m) 所需的最少转向次数。

示例1

输入

复制
5 5
0 0 0 0 0
1 0 1 1 0
1 0 0 0 0
1 1 1 1 0
1 1 1 1 0

输出

复制
1

说明

存在两种可能的路径,参考题面图片:


路径 1(1,1) \to (1,2) \to \dots \to (1,5) \to (2,5) \to \dots \to (5,5);转向次数 c = 1


路径 2(1,1) \to (1,2) \to (2,2) \to (3,2) \to (3,3) \to (3,4) \to (3,5) \to (4,5) \to (5,5);转向次数 c = 3


可以证明路径 1 转向次数最少。