方向偏移
大约 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即可
