python使用堆疊stack走出迷宮

2022-06-12 09:30:08 字數 2576 閱讀 1253

stack一般用來儲存已有的狀態,對於解決迷宮問題最是合適.

迷宮問題沒有什麼好的解決辦法,只能採用蠻力窮舉的辦法,要點是已經走過的路徑(包括可行路線和不可行路線)要進行標記,這樣可以避免原地死迴圈

#

用list實現乙個stack

class

stack(object):

def__init__

(self):

self.item =list()

#入棧defpush(self, node):

#刪除並返回棧頂乙個元素

defpop(self):

return

self.item.pop()

#返回棧頂乙個元素

defpeek(self):

return self.item[-1]

def__str__

(self):

return

str(self.item)

class

maze(object):

maze_wall = "*"

path_token = "x"

tried_token = "o"

def__init__

(self):

self.maze_cells = [['

*', '

*', '

*', '

*', '*'

], ['*

', none, '

*', none, '*'

], ['*

', none, none, none, '*'

], ['*

', none, '*'

, none, none],

['*', none, '

*', '

*', '*'

]] self.start = (4, 1)

self.end = (3, 4)

self.numrows, self.numcols = (5, 5)

self.path =none

#搜尋可行路線

deffind_path(self):

self.path =stack()

#起始點肯定是必經之路,入棧,標記為路徑

row, col =self.start

self._mark_path(row, col)

while

notself._exit_found(row, col):

#左1=col-1

if self._valid_move(row, col - 1):

self._mark_path(row, col - 1)

col = col - 1

#上1=row-1

elif self._valid_move(row - 1, col):

self._mark_path(row - 1, col)

row = row - 1

#右1=col+1

elif self._valid_move(row, col + 1):

self._mark_path(row, col + 1)

col = col + 1

#下1=row+1

elif self._valid_move(row + 1, col):

self._mark_path(row + 1, col)

row = row + 1

else

: self._mark_tried(row, col)

row, col =self.path.peek()

return

self.path

#判斷是否是可行進路線

def_valid_move(self, row, col):

return 0 <= row < self.numrows and 0 <= col < self.numcols and self.maze_cells[row][col] is

none

#判斷是否找到出口

def_exit_found(self, row, col):

return (row, col) ==self.end

#標記為已嘗試但不可行path

def_mark_tried(self, row, col):

self.maze_cells[row][col] =self.tried_token

self.path.pop()

#標記為可行路線

def_mark_path(self, row, col):

self.maze_cells[row][col] =self.path_token

self.path.push((row, col))

if__name__ == '

__main__':

m =maze()

path =m.find_path()

print(path)

stack堆疊容器

堆疊是一種線性表,插入和刪除操作只在表的一端進行,該端成為棧頂,另一端則稱為棧底。元素的入棧和出棧都是在棧頂進行的,因此堆疊是一種後進先出表 lifo c stl 的堆疊泛化是通過現有的序列容器來實現的,預設使用的是雙端佇列 deque 的資料結構。在 stl中,stack 的元素出棧操作是不返回棧...

stack堆疊容器

stack堆疊容器 堆疊是乙個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂 stack top 另一端則為棧底 stack bottom 堆疊的元素插入稱為入棧,元素的刪除稱為出棧。由於元素的入棧和出棧總在棧頂進行,因此,堆疊是乙個後進先出 last in first out 表,即 lifo...

集合》堆疊Stack

堆疊stack,先進後出,先入倉庫的貨物後出倉,後入倉庫的貨物先出倉。集合 堆疊stack 建立堆疊 using system using system.collections.generic using system.text using system.collections namespace ...