#34937: python 求救


s11104220@school.saihs.edu.tw (施同學)

學校 : 臺北市立松山高級工農職業學校
編號 : 221254
來源 : [118.165.11.221]
最後登入時間 :
2024-02-04 16:09:17
j125. 4. 蓋步道 -- 2022年10月APCS | From: [123.193.213.137] | 發表日期 : 2023-04-27 22:41

from collections import deque
from sys import stdin
d=[[0,1],[0,-1],[1,0],[-1,0]]#四個方向
def bfs(high):
    p=[[True]*n for _ in range(n)]#是否經過二維陣列
    tasks=deque([(0,0,0)])
    p[0][0]=False
    while tasks:#BFS
        x,y,dp=tasks.popleft()
        if x==n-1 and y==n-1:return dp#到達終點 回傳距離 直接離開 (第一次回傳距離會是最短的)
        for i in range(4):
            nx=x+d[i][0]#新位置
            ny=y+d[i][1]#新位置
            if n>nx>=0 and n>ny>=0:#是否超過範圍
                if abs(a[nx][ny]-a[x][y])<=high and p[nx][ny]:#高度差是否超過 且 沒走過
                    p[nx][ny]=False
                    tasks.append((nx,ny,dp+1))
    return False
n=int(stdin.readline())
a=[list(map(int,stdin.readline().split())) for _ in range(n)]#地圖
l=0
r=1000000
while r>=l:#二分搜高度差
    mid=(l+r)//2
    if bfs(mid):r=mid-1#如果最大高度差mid可以到達終點
    else:l=mid+1
print(l)#最低高度
print(bfs(l))#獲得最短路徑
 
#35090: Re: python 求救


s11104220@school.saihs.edu.tw (施同學)

學校 : 臺北市立松山高級工農職業學校
編號 : 221254
來源 : [118.165.11.221]
最後登入時間 :
2024-02-04 16:09:17
j125. 4. 蓋步道 -- 2022年10月APCS | From: [123.193.213.137] | 發表日期 : 2023-05-08 11:49

from collections import deque
from sys import stdin
d=[[0,1],[0,-1],[1,0],[-1,0]]#四個方向
def bfs(high):
    p=[[True]*n for _ in range(n)]#是否經過二維陣列
    tasks=deque([(0,0,0)])
    p[0][0]=False
    while tasks:#BFS
        x,y,dp=tasks.popleft()
        if x==n-1 and y==n-1:return dp#到達終點 回傳距離 直接離開 (第一次回傳距離會是最短的)
        for i in range(4):
            nx=x+d[i][0]#新位置
            ny=y+d[i][1]#新位置
            if n>nx>=0 and n>ny>=0:#是否超過範圍
                if abs(a[nx][ny]-a[x][y])<=high and p[nx][ny]:#高度差是否超過 且 沒走過
                    p[nx][ny]=False
                    tasks.append((nx,ny,dp+1))
    return False
n=int(stdin.readline())
a=[list(map(int,stdin.readline().split())) for _ in range(n)]#地圖
l=0
r=1000000
while r>=l:#二分搜高度差
    mid=(l+r)//2
    if bfs(mid):r=mid-1#如果最大高度差mid可以到達終點
    else:l=mid+1
print(l)#最低高度
print(bfs(l))#獲得最短路徑


我把二分搜改成DFS

再把r=1000000改成

r=max(a[i][j] for i in range(n) for j in range(n))-min(a[i][j] for i in range(n) for j in range(n))
就過了6.8s
 
ZeroJudge Forum