import sys
from collections import deque
# 全局蛇身队列(队头=蛇尾,队尾=蛇头)
snake = deque()
# 方向映射:1-上(0,1),2-下(0,-1),3-左(-1,0),4-右(1,0)
dir_map = {
1: (0, 1),
2: (0, -1),
3: (-1, 0),
4: (1, 0)
}
def moveSnake(dir):
"""移动逻辑:身体跟随前移,长度不变,碰撞检测新蛇身"""
global snake # 声明使用全局变量
if not snake:
return True
# 计算新蛇头
head_x, head_y = snake[-1]
dx, dy = dir_map[dir]
new_head = (head_x + dx, head_y + dy)
# 模拟移动后的新蛇身(移除蛇尾,添加新蛇头)
snake.popleft()
snake.append(new_head)
# 检测新蛇头是否与新身体(除头外)重叠
body_parts = list(snake)[:-1]
if new_head in body_parts:
return True # 碰撞,不执行移动
# 无碰撞,更新全局蛇身
return False
def eatSnake(dir):
"""生长逻辑:身体跟随前移+蛇尾保留,长度+1,碰撞检测新蛇身"""
global snake # 声明使用全局变量
if not snake:
return True
# 计算新蛇头
head_x, head_y = snake[-1]
dx, dy = dir_map[dir]
new_head = (head_x + dx, head_y + dy)
# 模拟生长后的新蛇身(保留所有身体,添加新蛇头)
snake.append(new_head)
# 检测新蛇头是否与新身体(除头外)重叠
body_parts = list(snake)[:-1]
if new_head in body_parts:
return True # 碰撞,不执行生长
# 无碰撞,更新全局蛇身
return False
def main():
global snake # 声明使用全局变量
data = sys.stdin.read().split()
it = iter(data)
n = int(next(it))
q = int(next(it))
# 初始化全局蛇身(清空原有内容)
snake.clear()
for _ in range(n):
x = int(next(it))
y = int(next(it))
snake.append((x, y))
# 处理每一步操作
for _ in range(q):
op = int(next(it))
dir = int(next(it))
collision = False
if op == 1:
collision = moveSnake(dir)
elif op == 2:
collision = eatSnake(dir)
# 碰撞则输出-1并终止
if collision:
print(-1)
return
# 无碰撞,输出蛇头到蛇尾(反向遍历队列)
for x, y in reversed(snake):
print(f"{x} {y}")
if __name__ == '__main__':
main()