🤖 C5-2 · 空间模拟
用坐标描述位置,用更新模拟移动——从时间模拟到空间模拟
📏
一、一维坐标(数轴)
- 表示:用一个变量pos表示位置
- 起点:pos = 0(原点)
- 向右:pos += x
- 向左:pos -= x
- 折返跑:奇数次正向,偶数次反向
📐
二、二维坐标(x,y)
- x:横坐标(左右/第几列)
- y:纵坐标(上下/第几排)
- 类比教室座位:先看列(x)再看排(y)
- 向上:x -= 1(y不变)
- 向下:x += 1(y不变)
🏙️
三、曼哈顿距离
- 公式:|x1-x2| + |y1-y2|
- x方向距离:|x1-x2|(必须取绝对值!)
- y方向距离:|y1-y2|(必须取绝对值!)
- 类比:城市走路只能横平竖直
- 不能走斜线!
🧭
四、方向数组dx/dy
- 编号:0=上 1=下 2=左 3=右
- dx[]={-1,1,0,0}(x的变化)
- dy[]={0,0,-1,1}(y的变化)
- 移动:x+=dx[d]; y+=dy[d];
- 一行代码代替四个if!
🗺️
五、路径记录
- 两个数组:pathX[] 和 pathY[]
- 记录起点:step=0先存(0,0)
- 每走一步:存新坐标,step++
- 二维地图:map[x][y]=1标记走过
- 输出地图:显示完整轨迹
🎯
六、核心思维
- 位置=状态
- 移动=状态转移
- 先定义起点,再写转移规则
- 一维用pos,二维用(x,y)
- 方向数组简化代码
📝 核心代码模板速查
模板1:一维折返跑模拟
double pos = 0; // 起点在0
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
double x;
cin >> x;
if (i % 2 == 1) pos += x; // 奇数次:正向
else pos -= x; // 偶数次:反向
}
cout << pos;
模板2:曼哈顿距离计算
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
int juli = 0;
// x方向距离(必须取绝对值!)
if (x1 < x2) juli += x2 - x1;
else juli += x1 - x2;
// y方向距离
if (y1 < y2) juli += y2 - y1;
else juli += y1 - y2;
cout << juli; // 输出曼哈顿距离
模板3:方向数组移动机器人
// 方向编号:0=上 1=下 2=左 3=右
int dx[] = {-1, 1, 0, 0}; // x(行)的变化
int dy[] = {0, 0, -1, 1}; // y(列)的变化
int x = 0, y = 0; // 起点(0,0)
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int d;
cin >> d; // 读方向编号
x += dx[d]; // 更新x坐标
y += dy[d]; // 更新y坐标
}
🔍 C5-2 知识对照表
| 知识点 | 关键代码/公式 | 易错点 |
| 一维坐标起点 | pos = 0 | 不是1!原点是0 |
| 向右移动 | pos += x | 加不是减 |
| 折返跑奇偶 | i%2==1 正向 | 第1次是正向 |
| x坐标含义 | x=横坐标(行) | 上-1下+1 |
| y坐标含义 | y=纵坐标(列) | 左-1右+1 |
| 曼哈顿距离 | |x1-x2|+|y1-y2| | 必须取绝对值! |
| 方向数组dx | {-1,1,0,0} | 上负下正 |
| 方向数组dy | {0,0,-1,1} | 左负右正 |
🗺️ C5-2 学习路线
📏 认识数轴→
🏃 一维移动模拟→
📐 二维坐标(x,y)→
🏙️ 曼哈顿距离→
🧭 方向数组→
🤖 机器人迷宫探险
⚠️ C5-2 高频易错点
① 起点是0不是1:一维坐标从原点0开始,不是从1开始。pos=0是初始位置!
② 曼哈顿距离必须取绝对值:|x1-x2|不管谁大谁小,距离都是正数。x1<x2时要算x2-x1,不能直接写x1-x2(会得到负数)。
③ x和y方向搞混:在代码坐标系中,x一般代表行(上下方向,上-1下+1),y代表列(左右方向,左-1右+1)。别搞反!
④ 方向数组对应关系:dx[]={-1,1,0,0}对应上、下、左、右的x变化;dy[]={0,0,-1,1}对应上、下、左、右的y变化。上下时y不变,左右时x不变。
⑤ 折返跑奇偶判断:第1次是正向(奇数次),判断i%2==1时pos+=x。不要写成i%2==0!
⑥ 记录路径数组大小:pathX[]和pathY[]要开足够大(如100),每走一步都要存坐标,别越界!
⑦ 模拟法四步骤:定义状态→设置变量→写转移规则→实现转移。不要漏了初始位置的设置!