直接模拟,维护当前的位置以及走过的格子数量,越过边界即可以退出。对于四角边界,只要其第一次经过的时候没有出去,那么第二次到达必然出去,由于不可能存在不经过四角边界的循环,所以一定有解。
这里可以用到一个方便的技巧,将每个符号映射为下标0,1,2,3,其中0和1相反,2和3相反,每次下标x取反只需要x和1异或。
Java
小红在一个广场上散步,广场上有 n x n 个格子。每个格子都有一个箭头,
'^'表示走到这个格子后要向上走,'v'表示走到这个格子后要向下走,'<'表示走到这个格子后要向左走,'>'表示走到这个格子后要向右走。
小红每次离开一个格子后,离开的那个格子的箭头方向就会变成反向,即'^'变成'v','v'变成'^','<'变成'>','>'变'<'。
给出小红当前的位置,她想知道她需要走多少步能走出广场?
若小红永远走不出广场,则输出 -1。
第一行输入一个整数n(1<n<100)表示广场大小。
接下来 n 行,每行输入一个长度为 n 的只由'^', 'v', '>', '<'组成的字符串表示广场上的格子。
接下来一行,输入两个整数x,y(1 <= x,y <= n)表示小红当前的位置。
输出一个整数表示答案。
输入
2
>v
^<
1 1
输出
5
说明
小红走第1步后,小红在格子(1,2),格子(1,1)变成反向,地图变成:
<v
^<
小红走第2步后,小红在格子(2,2),格子(1,2)变成反向,地图变成:
<^
^<
小红走第3步后,小红在格子(2,1),格子(2,2)变成反向, 地图变成:
<^
^>
小红走第4步后,小红在格子(1,1),格子(2,1)变成反向, 地图变成:
<^
v>
小红走第5步后,小红走出广场,格子(1,1)变成反向,地图变成:
>^
v>