方向偏移
大约 2 分钟搜索
计算机中的二维数组坐标系
在计算机的二维数组中,通常使用 (x, y)
的方式表示坐标:
- 第一个坐标
x
: 表示行号,从上到下递增 - 第二个坐标
y
: 表示列号,从左到右递增
常用写法
四方向
向上移动意味着当前行号减少:(-1, 0)
向下移动意味着当前行号增加:(1, 0)
向左移动意味着当前列号减少:(0, -1)
向右移动意味着当前列号增加:(0, 1)
移动的代码就是
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
八方向
在四方向的基础上增加斜边
左上:先往上移动 (-1, 0)
,再往左移动 (-1, 0)
+ (0, -1)
= (-1, -1)
左下:先往下移动 (1, 0)
,再往左移动 (1, 0)
+ (0, -1)
= (1, -1)
右上:先往上移动 (-1, 0)
,再往右移动 (-1, 0)
+ (0, 1)
= (-1, 1)
右下:先往下移动 (1, 0)
,再往右移动 (1, 0)
+ (0, 1)
= (1, 1)
移动的代码就是
int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
马走日
象棋中的马移动的移动方式是 “日” 字,分解一下:
先在一个方向(上、下、左、右)走 步
然后在垂直于第一个方向走 步
So
- 原四方向移动 步是:
上,下,左,右,偏移量如下图
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
- 现在在一个方向(上、下、左、右)走 步
int dx[] = {-2, 2, 0, 0};
int dy[] = {0, 0, -2, 2};
- 然后在垂直于第一个方向走 步
往上走有左、右两个方向 :
- 往左 :
(-2, 0)
+(0, -1)
=(-2, -1)
- 往右 :
(-2, 0)
+(0, 1)
=(-2, 1)
- 往左 :
往下走有左、右两个方向 :
- 往左 :
(2, 0)
+(0, -1)
=(2, -1)
- 往右 :
(2, 0)
+(0, 1)
=(2, 1)
- 往左 :
往左走有上、下两个方向 :
- 往上 :
(0, -2)
+(-1, 0)
=(-1, -2)
- 往下 :
(0, -2)
+(1, 0)
=(1, -2)
- 往上 :
往右走有上、下两个方向 :
- 往上 :
(0, 2)
+(-1, 0)
=(-1, 2)
- 往下 :
(0, 2)
+(1, 0)
=(1, 2)
- 往上 :
最终马走日的偏移量:
int dx[] = {-2, -2, 2, 2, -1, 1, -1, 1};
int dy[] = {-1, 1, -1, 1, -2, -2, 2, 2};
举个栗子
当有 dx[0] = -1, dy[0] = 0
表示"上"方向时,意思是:
- 当前位置的行号减 (向上移动一格)
- 当前位置的列号不变
在代码中实现:
int newx = x + dx[i]; // 新行坐标 = 当前行坐标 + 行偏移
int newy = y + dy[i]; // 新列坐标 = 当前列坐标 + 列偏移
如果当前位置 (x, y) == (3, 4)
,向上移动一格就是 。
这确实是减少了行号,对应了向上的方向。
小技巧
如果要同时遍历 个方向,只需要 个循环:
- 上下方向是列在变化,也就是只需要变动
j
即可 - 左右方向是行在变化,也就是只需要变动
i
即可