终于下课了,小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"。
每组数据换行符隔开。
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
Yes:3
Yes:10
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
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)
不知道你这个问题是否已经解决, 如果还没有解决的话: