X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从 A 区到 B 区去( A,B 区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了 A,B 区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
输入描述
第一行是一个整数 n,表示方阵的大小,4 ≤ n <100。
接下来是 n 行,每行有 n 个数据,可能是 A,B,+,- 中的某一个,中间用空格分开。A,B 都只出现一次。
输出描述
输出一个整数,表示坦克从 A 区到 B 区的最少移动步数。
如果没有方案,则输出 -1。
输入输出样例
示例
输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
输出
10
思路
广度优先搜索,只要每走一步判断是否是与当前位置相等,如果相等则不走
from collections import deque
import math
class Point:
def _init_(self,x=0,y=0): #创建节点
self.x = x
self.y = y
def bfs(begin,end):
max_value = math.inf
flag = 0
dist = [[max_value]*n for i in range(n)] #走到每一个点所需的距离
dist[begin.x][begin.y] = 0
q = deque()
q.append(begin)
dis = [(-1,0),(1,0),(0,-1),(0,1),] #四个方向
while q:
curr = q.popleft()
curr_x,curr_y = curr.x,curr.y
for i in dis:
tx,ty = i
nx,ny = curr_x + tx, curr_y + ty
if nx >= 0 and nx < n and ny >= 0 and ny <n and dist[nx][ny] == max_value \
and mp[nx][ny] != mp[curr.x][curr.y]:
dist[nx][ny] = dist[curr.x][curr.y] + 1 #走到后面一个位置的步数加1
point = Point()
point.x, point.y = nx,ny
q.append(point)
if nx == end.x and ny == end.y: #如果到达终点结束
flag = 1
break
if flag:
break
print(dist[end.x][end.y]) #打印到终点的步数
n = int(input())
mp = [list(map(str,input().split())) for i in range(n)]
begin = Point()
end = Point()
for i in range(len(mp)):
for j in range(len(mp[i])):
if mp[i][j] == "A": #起始点
begin.x = i
begin.y = j
if mp[i][j] == "B": #终点
end.x = i
end.y = j
bfs(begin,end)