事情的起因是做到了一道旋转矩阵的题目,虽然本身不难,但是一想到坐标的表示,就感受到了脑干缺失的痛苦
首先要说明的是,我们习惯的坐标系其实只要x表示列,y表示行即可,原点位置的改变理解起来问题不大。但是,原点坐标假定的错误是可能会导致问题的。
考虑这样一个数字依次排列的坐标系,存储它的数组是arr[x][y]
在二维数组中,我们通常把前一个[]中的当成行,后一个的当成列。毕竟监视窗口是这样显示,输入时也是这种顺序。
因此,我们暂且把二维数组的x、y轴这样划分
而我们习惯的坐标系有这两种(应该没人会喜欢把原点设在右边罢)
左边这种是一个很常见的陷阱!
因为对于二维数组本身排列顺序的理解,导致我们可能会把原点放到左上角,但又习惯了xy轴的排布,就会出现这种情况。接下来,让我们看看数字8:在左边的坐标系中,8是(3,2),但在实际调用中,它应该是(2,3),这便导致了错误
而右边这种则是正确,原因很简单,我们只要把它顺时针旋转90°就得到了二维数组的坐标系
对于一般情况,这样按照右边这种坐标系使用就OK了,但是如果在控制台输入一张地图,并且对方向有着明确的规定,那就可能会出现问题
比如来源于P1518这道题的地图
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
按照实际储存,C的坐标是(8,3),而对于一般认知它是(3,3)。假如我们要让C向上移动一格,对于一般认知是y轴++,但对于一个二维数组arr[x][y],它需要x--(列变小),很反人类对吧。
解决方法
在题设没有给定方向的情况下,我们把它看作逆时针旋转90°的样子,就能以一般认知来取坐标了。但如果给定了方向,则要记住别把xy轴搞错了哟