穿越雷区
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
思路:
这到题和迷宫题很像只是添加队列的添加不一样而已。我们先找到出发点A然后把他添加到队列中,反向我用的是f=[[1,0],[-1,0],[0,1],[0,-1]]来表示的,我们添加到队列中条件:
上层的是+时这次就要走-;
上层的是-时这次就要走+;
就有点像移动的墙一样,然后一直广搜就可以知道最近的步数了。
程序:
n=int(input())
m=[input().replace(" ","") for i in range(n)]
c=[[-1 for i1 in range(n)] for i in range(n)]
d=[]
f=[[1,0],[-1,0],[0,1],[0,-1]]
def bfs():
while d!=[]:
x,y=d.pop(0)
for i in f:
x1=x+i[0]
y1=y+i[1]
if -1<x1<n and -1<y1<n and c[x1][y1]==-1:
if m[x1][y1]=="B":
c[x1][y1]=c[x][y]+1
return c[x1][y1]
if (m[x][y]=="-" and m[x1][y1]=="+" )or (m[x][y]=="+" and m[x1][y1]=="-") or m[x][y]=="A":
d.append([x1,y1])
c[x1][y1]=c[x][y]+1
for i in range(n):
for j in range(n):
if m[i][j]=="A":
d.append([i,j])
c[i][j]=0
break
print(bfs())
禁止转载。仅用于自己学习。对程序错误不负责。