题号:NC277056
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld
题目描述

你需要在一个可以上下左右移动的

棋盘上解开一个迷宫:棋盘四周都是墙;每个方格要么是可以通过的空方格

,要么是不可通过的墙方格

;你可以沿着空方格通行;你已经被传送到了迷宫的左上角(第

行第

列的位置),你知道终点位于迷宫右下角(第

行第

列
的位置)。

别人都不知道的是,你是一个虫洞大师,当你所在的位置能同时看到左右两侧或上下两侧
最近的那两面相对的墙时,你可以在这两面墙上开启虫洞,
靠近后从一侧进入,穿越它到达另一侧。

现在,你准备好以最短的步数离开迷宫了吗!
输入描述:

第一行输入一个整数
)
代表迷宫的大小。

此后

行,第

行输入

个整数
)
代表迷宫中第

行第

列这个格子中的情况,其中

代表空方格,

代表墙方格。保证起点和终点不为墙壁。
输出描述:
在一行上输出一个整数,代表离开迷宫需要的最短步数,如果无论如何都无法离开迷宫,则直接输出
。
示例1
输入
复制
5
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
1 0 0 0 0
说明

该样例示意图如下图所示。全部墙壁的位置都使用粗黑线标注。先从
)
向右移动一步走到
)
,此时可以开启一个虫洞(使用紫色箭头标注),向上移动一步到达
)
;此时可以开启第二个虫洞(使用红色箭头标注),向左移动一步到达
)
。

注意,在该样例中,不能直接从
)
开启虫洞(
使用黑色箭头标注)到达
)
,因为
)
存在两面墙遮挡了视线;
不能直接从
开启虫洞(使用绿色箭头标注)到达
,因为这两面墙不是相对的。
示例2
输入
复制
5
0 0 0 1 0
1 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0