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 ...