[python3][题解]拖拉机

题目

题目描述

干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。

他的奶牛非常调皮,决定对约翰来场恶作剧。

她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些干草捆。

拖拉机的位置以及 N 捆干草的位置都是二维平面上的整数坐标点。

拖拉机的初始位置上没有干草捆。

当约翰驾驶拖拉机时,他只能沿平行于坐标轴的方向(北,南,东和西)移动拖拉机,并且拖拉机必须每次移动整数距离。

例如,驾驶拖拉机先向北移动 2 单位长度,然后向东移动 3 单位长度。

拖拉机无法移动到干草捆占据的位置。

请帮助约翰确定他需要移除的干草捆的最小数量,以便他能够将拖拉机开到二维平面的原点。

输入格式

第一行包含三个整数:N 以及拖拉机的初始位置 (x,y)。

接下来 N 行,每行包含一个干草捆的位置坐标 (x,y)。

输出格式

输出约翰需要移除的干草捆的最小数量。

数据范围

1 ≤ N ≤ 50000 , 1≤N≤50000, 1N50000,
1 ≤ x , y ≤ 1000 1≤x,y≤1000 1x,y1000

题解

from collections import deque

MAX = 10000000000
A = [[0] * 1010 for i in range(1010)]
D = [[MAX] * 1010 for i in range(1010)]
dx = [1,-1,0,0]
dy = [0,0,1,-1]
def bfs(x,y):
    global MAX
    q = deque()
    q.append((x,y))
    D[x][y] = 0
    while q:
        u = q.popleft()
        for k in range(4):
            i = dx[k] + u[0]
            j = dy[k] + u[1]
            if i < 0 or i > 1005 or j < 0 or j > 1005:continue
            if A[i][j] == 1 and D[i][j] > D[u[0]][u[1]] + 1:
                D[i][j] = D[u[0]][u[1]] + 1
                q.append((i,j))
            elif A[i][j] == 0 and D[i][j] > D[u[0]][u[1]]:
                D[i][j] = D[u[0]][u[1]]
                q.appendleft((i,j))
    return D[0][0]

def main():
    n,x,y = map(int,input().split())
    for _ in range(n):
        a,b = map(int,input().split())
        A[a][b] = 1
    print(bfs(x,y))


if __name__ == '__main__':
    main()

这道题为模板题,双端队列广搜。

特别要注意数据范围问题。
虽然 1 ≤ x , y ≤ 1000 1≤x,y≤1000 1x,y1000,但并没有限定田地的坐标范围,
所以合法坐标范围不能设置得太窄,否则可能会被卡数据点。


原创不易,感谢支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值