一道搜索题,始终做不对

传球游戏

题目背景

终于下课了,小A都等不及了。今天小A和他的朋友们在操场上玩着传球游戏。

题目描述

这些同学排成n排,每一排人数不等。一些同学穿着红衣服,一些同学穿着蓝衣服,不同颜色队服的同学可以互相传球(A为红色队服,B为蓝色队服),相同队服颜色的同学不能互相传球,传球的时候,只有排数相邻且坐标差距相邻(如第一排球员坐标为2,则可以传给第二排坐标为1,2,3的队员)的队员之间可以传球(每排的队员队服颜色可能不同),每排之间的间距为x[i],每排有y[i]个球员。小A在第一排,小B在第n排,小A需要通过他的同学将球传给小B,可以往前传,也可以往后传(顺序可以为1-2-1),求出小A能否把球传给小B,如果可以求出最短距离。(本题有多组数据)

输入格式

第1行输入m,表示有m组数据;

每组数据第1行输入n,代表有n排;

每组数据第2行输入x[i],共n-1个数字,空格隔开,表示每排间距;

接下来2n行,第一行输入y[i],表示每排人数,第二行输入y[i]个字符,表示每个队员的队服颜色,从上到下,"R"表示红色,"B"表示蓝色。

接下来一行,两个数,表示A点和B点在所在排数中的坐标(每一排的坐标默认从上往下,从1开始)。

输出格式

每组数据都要输出,如果小A可以把球传给小B,输出"Yes"后紧跟":",在冒号后面输出最短距离;

如果不能,则输出"No"。

每组数据换行符隔开。

样例 #1

样例输入 #1

2
4
1 1 1
3
B R B
4
R B R R
2
R B
1
B
2 1
4
2 3 1
4
R B R B
5
B B B B B
5
R B B B B
1
R
3 1

样例输出 #1

Yes:3
Yes:10

样例 #2

样例输入 #2

3
3
2 2 
2
B B
3 
B B B
1
B
1 1
4
5 5 5
4
R R R R
4 
B B B B
4
R R R R
4
B B B B
1 1
4
2 2 2
3
B R B
4
R B B R
5
B B B B R
1
R
2 1

样例输出 #2

No
Yes:15
No

提示

样例解释:见附件

数据范围:1≤m≤100,1≤n≤1000,1≤x[i]≤100,1≤y[i]≤5000。

此题我自己出的,思路用广搜做,RE了,不知道怎么做

请问要代码还是思路

通过 BFS 来找到从起点到终点的最短路径,并返回最短路径的长度。如果不存在从起点到终点的路径,则返回 -1


from collections import deque

def bfs(x, y, a, b, color, dist):
    q = deque([(a, b, 0)])
    visited = set()
    while q:
        i, j, d = q.popleft()
        if (i, j) in visited:
            continue
        visited.add((i, j))
        if i == x and j == y:
            return d
        for dx, dy in [(0, -1), (0, 1), (1, 0), (-1, 0)]:
            x_ = i + dx
            y_ = j + dy
            if x_ < 1 or x_ > n or y_ < 1 or y_ > y[x_ - 1]:
                continue
            if color[x_ - 1][y_ - 1] == color[i - 1][j - 1]:
                continue
            if dist[x_][y_] > dist[i][j] + 1:
                dist[x_][y_] = dist[i][j] + 1
                q.append((x_, y_, dist[x_][y_]))
    return -1

t = int(input().strip())
for _ in range(t):
    n = int(input().strip())
    x = [0] + [int(i) for i in input().strip().split()]
    y = [0] * n
    color = []
    for i in range(n):
        y[i] = int(input().strip())
        color.append(input().strip())
    a, b = map(int, input().strip().split())
    dist = [[float('inf')] * (max(y) + 1) for _ in range(n + 1)]
    dist[0][b] = 0
    d = bfs(0, b, a, b, color, dist)
    if d == -1:
        print("No")
    else:
        print("Yes:", d)

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^