题目信息: 综合练习 难度:###/### 算法 目标
编程实现∶
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
示例二
输入:
5
A + - + B
- + + + +
+ + + - +
+ + + + -
+ - + - +
输出: 4
示例三
输入:
4
A - + -
+ + + +
- + - +
B + - -
输出: 3
题解:(做不出来或已做完再看)
def bfs(start,end):
queue = [[start,0]]
while len(queue) != 0:
u,ans = queue.pop(0)
x,y = u[0],u[1]
if u == end:
return ans
vis[x][y] = 1
dx = [-1,0,1,0]
dy = [0,1,0,-1]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n and vis[nx][ny] == 0 and ls[nx][ny] != ls[x][y]:
queue.append([(nx,ny),ans +1])
return -1
n = int(input())
ls = []
for i in range(n):
x = input().split()
for j in range(n):
if x[j] == "A":
start = (i,j)
elif x[j] == "B":
end = (i,j)
ls.append(x)
vis = []
for i in range(n):
vis.append([0]*n)
res = bfs(start,end)
print(res)