虫洞操纵者
题号:NC277056
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\,\,\,\,\,\,\,\,\,\,你需要在一个可以上下左右移动的 n\times n 棋盘上解开一个迷宫:棋盘四周都是墙;每个方格要么是可以通过的空方格 \sf '0' ,要么是不可通过的墙方格 \sf '1' ;你可以沿着空方格通行;你已经被传送到了迷宫的左上角(第 1 行第 1 列的位置),你知道终点位于迷宫右下角(第 n 行第 n的位置)。
\,\,\,\,\,\,\,\,\,\,别人都不知道的是,你是一个虫洞大师,当你所在的位置能同时看到左右两侧或上下两侧最近的那两面相对的墙时,你可以在这两面墙上开启虫洞,靠近后从一侧进入,穿越它到达另一侧。
\,\,\,\,\,\,\,\,\,\,现在,你准备好以最短的步数离开迷宫了吗!

输入描述:

\,\,\,\,\,\,\,\,\,\,第一行输入一个整数 n\left(2\le n \le 10^3\right) 代表迷宫的大小。
\,\,\,\,\,\,\,\,\,\,此后 n 行,第 i 行输入 n 个整数 a_{i,1},a_{i,2},\dots,a_{i,n} \left(0\le a_{i,j}\le 1\right) 代表迷宫中第 i 行第 j 列这个格子中的情况,其中 0 代表空方格,1 代表墙方格。保证起点和终点不为墙壁。

输出描述:

\,\,\,\,\,\,\,\,\,\,在一行上输出一个整数,代表离开迷宫需要的最短步数,如果无论如何都无法离开迷宫,则直接输出 -1
示例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

输出

复制
3

说明

\,\,\,\,\,\,\,\,\,\,该样例示意图如下图所示。全部墙壁的位置都使用粗黑线标注。先从 (1,1) 向右移动一步走到 (1,2) ,此时可以开启一个虫洞(使用紫色箭头标注),向上移动一步到达 (5,2) ;此时可以开启第二个虫洞(使用红色箭头标注),向左移动一步到达 (5,5)
\,\,\,\,\,\,\,\,\,\,
\,\,\,\,\,\,\,\,\,\,注意,在该样例中,不能直接从 (1,1) 开启虫洞(使用黑色箭头标注)到达 (1,5) ,因为 (1,4) 存在两面墙遮挡了视线;不能直接从 (4,3) 开启虫洞(使用绿色箭头标注)到达 (1,3) ,因为这两面墙不是相对的。
\,\,\,\,\,\,\,\,\,\,
示例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

输出

复制
5

说明

\,\,\,\,\,\,\,\,\,\,
示例3

输入

复制
2
0 1
1 0

输出

复制
-1