(1)一个城市被分成许多区域,有些区域信号强,有些信号差。小明想从西北角(左上)走到东南角(右下),且不希望经过信号差的区域,请你编程计算他最短要走多远的路。 输入描述: 第一行输入一个整数n(n < 100),接下来是一个n*n的矩阵,1 表示信号强的区域,0 表示信号差的区域。可以横着走(向东或者向西),也可以竖着走(向南或者向北),不可以斜着走。 输出描述: 输出小明要走的最短路长度。如果小明找不到满足要求的路,输出-1。
示例1 输入 5 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 输出 10
输入 5 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 输出 -1
以下代码为本人原创,可以供大家参考,若有不足之处,感谢指出!!!!
n = int(input())
matrix = []
for i in range(n):
matrix.append(list(map(int, input().split())))
from heapq import *
visited = set()
import copy
def bfs(i, j):
if matrix[i][j] == 0:
return -1
visited.add((i, j))
q = [[0, i, j, visited]]
heapify(q)
while q:
ans, x, y, vi = heappop(q)
if x==n-1 and y==n-1:
return ans
for a, b in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
newi = x + a
newj = y + b
if 0 <= newi < n and 0 <= newj <n and matrix[newi][newj] == 1 and (newi, newj) not in vi:
vi2 = copy.deepcopy(vi)
vi2.add((newi, newj))
heappush(q, [ans+1, newi, newj, vi2])
return -1
print(bfs(0, 0))