P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two (python题解)

部署运行你感兴趣的模型镜像
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 次以内)未相遇则判定为无法抓住。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值