藍橋 迷宮 Python bfs

2021-10-24 17:02:53 字數 3083 閱讀 7687

"""

其中標記為1的為障礙,標記為0的為可以通行的地方。

"""from pprint import pprint

# 讀取資料

data =

with

open

('maze.txt'

)as f:

lines = f.readlines(

)for line in lines::-

1])data_new =

for i in

range

(len

(data)):

)for j in

range

(len

(data[0]

)): data_new[i]

int(data[i]

[j])

)# pprint(data_new)

class

point

:def

__init__

(self, x, y)

: self.x = x

self.y = y

# 橫著的是width 豎著的是length

queue =

# 順時針 右、下、左、上

dx =[0

,1,0

,-1]

# 外層 length

dy =[1

,0,-

1,0]

# 內層 width

width =

len(data_new[0]

)length =

len(data_new)

dis =[[

-1for _ in

range

(width)

]for _ in

range

(length)

]# 生成距離(原點)矩陣

dis[0]

[0]=

0# d記起點距自己距離為0

begin = point(0,

0)end = point(length -

1, width -1)

pre =[[

none

for _ in

range

(width)

]for _ in

range

(length)

]# 當前點的上乙個點,用於輸出路徑軌跡

stack =

# 記錄路徑

defbfs

(maze:

list

, begin: point, end: point)

:global queue, seen, dx, dy, width, length, pre, stack

while queue:

# while len(queue) > 0:

vertex = queue.pop(0)

for i in

range(4

):nx, ny = vertex.x + dx[i]

, vertex.y + dy[i]

if width > ny >=

0and

0<= nx < length:

# 如果沒有過屆 if0

== data_new[nx]

[ny]

and dis[nx]

[ny]==-

1:# 如果在一行判斷可能會 index out of range

dis[nx]

[ny]

= dis[vertex.x]

[vertex.y]+1

# 即將訪問的點(的距離)等於上乙個點的距離 +1

)# 把該點加入佇列 準備下一次探索

pre[nx]

[ny]

= vertex # 記錄當前節點的上一節點

if nx == end.x and ny == end.y:

# 如果該點是終點, 那麼停止搜尋

break

while

true

:# 從終點前推

stack.insert(

0, end)

if end.x == begin.x and end.y == begin.y:

break

end = pre[end.x]

[end.y]

# print('路徑')

# while stack:

# curr = stack.pop()

# print((curr.x, curr.y))

bfs(maze=data_new, begin=begin, end=end)

defrdlu

(now: point,

next

: point)

:# 判斷走向的函式

ifnext

.x == now.x and

next

.y == now.y +1:

return

'r'if

next

.x == now.x and

next

.y == now.y -1:

return

'l'if

next

.x == now.x -

1and

next

.y == now.y:

return

'u'if

next

.x == now.x +

1and

next

.y == now.y:

return

'd'ans =

''for i in

range(1

,len

(stack)):

# print(rdlu(stack[i-1], stack[i]))

ans += rdlu(stack[i-1]

, stack[i]

)print

(ans,

'\n'

,len

(ans)

)

迷宮 藍橋 迷宮 BFS DFS

很久沒有認真的寫一道dfs和bfs的題了 今天早上這個題花了1個多小時,竟然還沒對。答案一直出錯,我都快崩潰了,那麼簡單的題。我tm 晚上又重寫了一遍,答案對了。但是還是不知道為什麼早上的錯了。也沒留備份。include include include using namespace std con...

迷宮 藍橋初賽

下圖給出了乙個迷宮的平面圖,其中標記為1 的為障礙,標記為0 的為可以通行的地方。010000 000100 001001 110000 迷宮的入口為左上角,出口為右下角,在迷宮中,只能從乙個位置走到這個它的上 下 左 右四個方向之一。對於上面的迷宮,從入口開始,可以按drrurrdddr 的順序通...

藍橋杯之迷宮

請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多餘的內容。思路 本來想的是類似求解迷宮問題的深搜,發現它無法遍歷每個點,還不如兩層迴圈來得快,判斷每個點,然後用深搜,每走一步標記陣列對應值改變為 1,超出邊界符合題意,移動到標記陣列值為 1 則表示兜圈子,直到所有點判斷結束。include us...