AcWing 1219. 移动距离
原题链接
简单
作者:
风平浪静_7
,
2023-02-08 23:10:27
,
所有人可见
,
阅读 158
# 大致思路:
# 把最左上角编号为1的作为原点,建立平面直角坐标系,竖直向下为x轴正方向,水平向右为y轴正方向
# 点m的坐标为(m_x, m_y),点n的坐标为(n_x, n_y)
# 两点的最短移动距离:abs(m_x - n_x) + abs(m_y - n_y)
# x轴方向上的坐标差 与 y轴方向上的坐标差 有点像矩形的长和宽
w, m, n = map(int, input().split())
m_x, m_y = (m-1)//w, 0 # x和y都是从0开始,代入题目中的样例,体会 (m-1)//w 和 (n-1)//w
n_x, n_y = (n-1)//w, 0
flag = -1
right = True
y = -1
for i in range(1, max(m, n) + 1):
flag += 1
if right:
if flag == w:
right = False
flag = 0
else:
y += 1
else:
if flag == w:
right = True
flag = 0
else:
y -= 1
if i == m:
m_y = y
if i == n:
n_y = y
print(abs(m_x - n_x) + abs(m_y - n_y))
# 一个编号为i_old(old_x, old_y),此编号值是宽度的整数倍,设下一个编号为i_new(new_x, new_y)
# 那么有这样的结论:new_x = old_x + 1 并且 new_y = old_y
# (就是 “拐角处” 的y轴坐标不变,x轴坐标加1)
# 由此可以稍微简化代码:
w, m, n = map(int, input().split())
m_x, m_y = (m-1)//w, 0
n_x, n_y = (n-1)//w, 0
y = 0 # 初始化为 编号为1 的y轴坐标
dt = 1 # 控制 “方向”, 正数:向右,负数:向左
for i in range(1, max(m, n) + 1): # 拿到编号 i
if i == m:
m_y = y
if i == n:
n_y = y
if i % w == 0: # 如果处于 “拐角处”,那么此时要换成相反数
dt = -1 if dt == 1 else 1
continue # 用continue就可以跳过 “y += dt”这条语句,这样y轴坐标就不会改变
y += dt
print(abs(m_x - n_x) + abs(m_y - n_y))