[每日CPE] UVA10336

楼主: kerycheng (kk)   2022-12-19 16:14:35
UVA10336 Rank the Languages
经典的DFS油田题目,这题只需要分上下左右,不需要计算斜向
大意就是会给你一张由英文字母组成的地图
要你计算所出现的英文字母"区块"的次数,例如
ttuuttdd
ttuuttdd
uuttuudd
uuttuudd
这样t有三块、u有三块、d只有一块
input的第一行会告诉你有几笔测资,第二行是地图的高和宽,第三行开始就是地图
output规定输出是world #n,n代表第几笔测资。接下来就是把出现的字母按照出现次数由
大到小印出来,如果次数相同则从较小的字母开始印
程式:
def dfs(_map, ifvisited, i, j):
# 将当前位置记录已访问
ifvisited[i][j] = True
if _map[i + 1][j] == _map[i][j] and not ifvisited[i + 1][j]:
dfs(_map, ifvisited, i + 1, j)
if _map[i][j + 1] == _map[i][j] and not ifvisited[i][j + 1]:
dfs(_map, ifvisited, i, j + 1)
if _map[i - 1][j] == _map[i][j] and not ifvisited[i - 1][j]:
dfs(_map, ifvisited, i - 1, j)
if _map[i][j - 1] == _map[i][j] and not ifvisited[i][j - 1]:
dfs(_map, ifvisited, i, j - 1)
# 读计算次数
N = int(input())
for i in range(N):
# 读高、宽
H, W = map(int, input().split())
count = [0] * 26 # 存出现的英文字母
max_ = -1 # 纪录最大的区块数
world_map = [] # 存地图
ifvisited = [] # 记录访问过的位置
# 读地图并在上下两行新增空格
world_map.append(' ' * (W + 2))
for j in range(H):
input_ = input()
world_map.append(' ' + input_ + ' ')
world_map.append(' ' * (W + 2))
ifvisited = [[False] * (W + 2) for _ in range(H + 2)]
# 遍历地图每个位置
for j in range(1, H + 1):
for k in range(1, W + 1):
# 如果当前位置没被访问 就进行DFS
if not ifvisited[j][k]:
# 更新最大值
if max_ < count[ord(world_map[j][k]) - ord('a')] + 1:
max_ = count[ord(world_map[j][k]) - ord('a')] + 1
# 进行DFS 并让字母++
dfs(world_map, ifvisited, j, k)
count[ord(world_map[j][k]) - ord('a')] += 1
print("World #{}".format(i + 1))
for j in range(max_, 0, -1):
for k in range(26):
if count[k] == j:
print("{}: {}".format(chr(k + ord('a')), count[k]))
作者: wu10200512 (廷廷)   2022-12-19 16:15:00
大师
作者: JenniferLope (ㄚ)   2022-12-19 16:19:00
大师
作者: ILoveErr (英梨梨我老婆)   2022-12-19 16:25:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com