蓝桥杯:穿越雷区【Python实现】

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值