1. 程式人生 > >實現深度優先搜尋DFS(以迷宮解救為例子)

實現深度優先搜尋DFS(以迷宮解救為例子)

演算法描述:給定開始點座標(x,y) 和終點座標(p,q),在一個二維數組裡面,其中1代表障礙物,0則沒有。求開始到終點的最短距離。

程式碼如下:

MIN = 9999999

a = [[0 for col in range(50)] for row in range(50)]#迷宮最大陣列
book = [[0 for col in range(50)] for row in range(50)]#標記陣列

def dfs(start_x,start_y,end_x,end_y,migong_array,step):
    '''
    :param start_x: 起始橫座標
    :param start_y: 起始縱座標
    :param end_x: 終點橫座標
    :param end_y: 終點縱座標
    :param migong_array: 迷宮的陣列
    :return:
    '''
next_step = [[0,1], #向右走 [1,0], #向下走 [0,-1], #向左走 [-1,0] #向上走 ] if (start_x == end_x and start_y == end_y): global MIN if(step < MIN): MIN = step return for i in range(len(next_step)): next_x = start_x + next_step[i][0
] next_y = start_y + next_step[i][1] if(next_x < 0 or next_y < 0 or next_x > len(migong_array) or next_y > len(migong_array[0])): continue if(a[next_x][next_y] == 0 and book[next_x][next_y] == 0): book[next_x][next_y] = 1 dfs(next_x,next_y,end_x,end_y,migong_array,step+1
) book[next_x][next_y] = 0 return if __name__ == '__main__': start_x = 0 start_y = 0 end_x = 3 end_y = 2 migong_array = [[0,0,1,0],[0,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,0,1]] #初始化迷宮 for i in range(len(migong_array)): for j in range(len(migong_array[0])): a[i][j] = migong_array[i][j] #將迷宮陣列寫入a中 book[start_x][start_y] = 1 #將第一步標記為1,證明走過了。避免重複走 dfs(start_x,start_y,end_x,end_y,migong_array,0) print('The min length of path is : {}'.format(MIN)) #輸出為7,即最短路徑為 7