菜雞的秋招記錄——機試編程題(ZX)

 

在一家博物館裏,有一件珍貴的珠寶放在一個房間裏。博物館的房間以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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章