d = [(-1, 0), (0, 1), (1, 0), (0, -1)]
## 定义了四个方向的坐标变化,分别对应上、右、下、左四个方向,用于计算移动后的位置。
g = [input().strip() for _ in range(10)]
## 读取 10 行的网格数据,每行是一个长度为 10 的字符串,代表 10×10 的网格,其中*表示障碍物。
fj = None
c = None
for i in range(10):
for j in range(10):
## 通过两层for循环遍历网格,找到F(Farmer John)和C(两头牛)的初始坐标,分别存储在fj和c中。
if g[i][j] == 'F':
fj = (i, j)
elif g[i][j] == 'C':
c = (i, j)
fj_dir = 0
c_dir = 0
## 初始时 Farmer John 和牛的移动方向都为 “上”(对应方向列表中的索引 0)。
for time in range(1, 1001):
## 循环最多 1000 次(for time in range(1, 1001)),因为网格是 10×10 的,移动方式有周期性,若超过 1000 次还未相遇,可认为永远不会相遇。
fi, fj_pos = fj
fd = fj_dir
fnx, fny = fi + d[fd][0], fj_pos + d[fd][1]
## 对于 Farmer John 和牛,每次先计算沿当前方向移动后的新坐标(fnx, fny和cnx, cny)。
if 0 <= fnx < 10 and 0 <= fny < 10 and g[fnx][fny] != '*':
fj = (fnx, fny)
else:
fj_dir = (fj_dir + 1) % 4
## 检查新坐标是否在网格范围内且不是障碍物(*),如果是,就移动到新坐标;否则,将方向顺时针旋转 90 度(通过(fj_dir + 1) % 4或(c_dir + 1) % 4实现)。
ci, cj = c
cd = c_dir
cnx, cny = ci + d[cd][0], cj + d[cd][1]
if 0 <= cnx < 10 and 0 <= cny < 10 and g[cnx][cny] != '*':
c = (cnx, cny)
else:
c_dir = (c_dir + 1) % 4
if fj == c:
## 每次移动后,检查 Farmer John 和牛的位置是否相同(if fj == c),如果相同,输出当前时间time并退出程序;若循环结束后仍未相遇,输出0。
print(time)
exit()
print(0)
## 整体逻辑:
## 代码通过模拟 Farmer John 和牛在网格中的移动过程,根据他们的移动规则(前方有障碍则顺时针转 90 度,否则前进),判断是否会在某一时刻处于同一位置,从而确定 Farmer John 抓住牛所需的时间,若长时间(1000 次以内)未相遇则判定为无法抓住。
P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two (python题解)
最新推荐文章于 2025-12-08 20:31:24 发布
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
Python3.10
Conda
Python
Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本
153

被折叠的 条评论
为什么被折叠?



