在一家博物館裏,有一件珍貴的珠寶放在一個房間裏。博物館的房間以NxM網格的形式呈現。博物館的所有房間都與相鄰的房間相連。有一名叫山姆的小偷打算偷這件珠寶,他設法弄到了一些房間 (包括放置寶石的房間)的鑰匙。他從網格左上角發單元格所表示的房間逬入博物館。山姆有鑰匙的房間表示爲1,沒有鑰匙的房間表示爲0,有珠寶的房間表示爲9。
寫一個算法,如果山姆到達有珠寶的房間,輸出1;否則,輸出0。
輸入:
該函數/方法的輸入包括三個參數—— rows, —個整數,表示網格grid中的行數(N) ;columns, —個整數,表示網格grid中的列數(M);grid,表示一個二維的整數網格。
輸出:
如果山姆到達有珠寶的房間,則返回整數1,否則返回整數0。
注意:
山姆不能對角移動。
示例 :
輸入:
rows=3 columns = 4 grid = 1111 0100 0191
輸出:
1
思路:寬度優先搜索
代碼:
from Queue import Queue
def canReach(i, j, rows, columns, grid, flag):
if i >= 0 and i < rows and j >= 0 and j < columns and flag[i][j] and grid[i][j] != 0:
return 1
return 0
def isPath(rows, columns, grid):
if rows < 1 or columns < 1 or grid[0][0] == 0:
return 0
flag = [[1]*columns for i in range(rows)]
que = Queue()
que.put(0)
que.put(0)
while que:
i, j = que.get(), que.get()
if grid[i][j] == 9:
return 1
if canReach(i-1, j, rows, columns, grid, flag):
que.put(i-1)
que.put(j)
flag[i-1][j] = 0
if canReach(i+1, j, rows, columns, grid, flag):
que.put(i+1)
que.put(j)
flag[i+1][j] = 0
if canReach(i, j-1, rows, columns, grid, flag):
que.put(i)
que.put(j-1)
flag[i][j-1] = 0
if canReach(i, j+1, rows, columns, grid, flag):
que.put(i)
que.put(j+1)
flag[i][j+1] = 0
return 0
rows = 3
columns = 3
#grid = [[1,1,1,1],[0,1,0,0],[0,1,9,1]]
grid = [[0, 0, 0], [9, 1, 1], [0, 1, 1]]
print isPath(rows, columns, grid)
emmmm....一共有兩道編程題,另一道題沒有什麼難度,就不整理了。
語言:python2.7。
崗位:好像是開發類的。
時間:9.3