题目
题目描述
干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地*了。
他的奶牛非常调皮,决定对约翰来场恶作剧。
她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些干草捆。
拖拉机的位置以及 N 捆干草的位置都是二维平面上的整数坐标点。
拖拉机的初始位置上没有干草捆。
当约翰驾驶拖拉机时,他只能沿平行于坐标轴的方向(北,南,东和西)移动拖拉机,并且拖拉机必须每次移动整数距离。
例如,驾驶拖拉机先向北移动 2 单位长度,然后向东移动 3 单位长度。
拖拉机无法移动到干草捆占据的位置。
请帮助约翰确定他需要移除的干草捆的最小数量,以便他能够将拖拉机开到二维平面的原点。
输入格式
第一行包含三个整数:N 以及拖拉机的初始位置 (x,y)。
接下来 N 行,每行包含一个干草捆的位置坐标 (x,y)。
输出格式
输出约翰需要移除的干草捆的最小数量。
数据范围
1
≤
N
≤
50000
,
1≤N≤50000,
1≤N≤50000,
1
≤
x
,
y
≤
1000
1≤x,y≤1000
1≤x,y≤1000
题解
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
1≤x,y≤1000,但并没有限定田地的坐标范围,
所以合法坐标范围不能设置得太窄,否则可能会被卡数据点。
原创不易,感谢支持。