6届国赛java试题 4: 穿越雷区

穿越雷区


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())

禁止转载。仅用于自己学习。对程序错误不负责。

猜你喜欢

转载自blog.csdn.net/weixin_46640345/article/details/112861892
今日推荐