广搜—坦克问题

76 阅读1分钟

题目信息: 综合练习 难度:###/### 算法 目标 

编程实现∶

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? 已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。 例如: A + - + - - + - - + - + + + - + - + - + B + - + - 坦克车只能水平或垂直方向上移动到相邻的区。 输入描述∶ 输入第一行是一个整数n,表示方阵的大小, 4<=n<100; 接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。 A,B都只出现一次。 样例输出∶ 要求输出一个整数,表示坦克从A区到B区的最少移动步数。 如果没有方案,则输出-1 

示例一 

输入:

A + - + -
- + - - +
- + + + -
+ - + - + 
B + - + - 
输出: 10 

 示例二 

输入: 

A + - + B
- + + + +
+ + + - + 
+ + + + -
+ - + - + 
输出: 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)