🤖 C5-2 坐标与空间上的模拟

一维/二维坐标 · 曼哈顿距离 · 方向数组dx/dy · 路径记录

🤖 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),每走一步都要存坐标,别越界!
⑦ 模拟法四步骤:定义状态→设置变量→写转移规则→实现转移。不要漏了初始位置的设置!