第一道题。递归,感染问题, 太激动了。考试的时候没做出来。太急躁了。想在感染的时候就求出来,这样不好。
先感染后求值。这样就简单了。
题目就是一个二维数组, 求单入口连通区域最大值。入口只能从边缘入‘O’进去,'O' 代表连通的。‘X’代表不连通
如果连通的区域还有'O'在边缘,那么就不算
-
输入:
第一行输入: 输入的是 m n, m代表行, n代表列。
接下来的输入就是二维数组。 -
输出:
1:如果最大的单入口区域只有一个,那么输出坐标 和 通区域最大值是多少
2:如果没有入口,输出 None
3: 如果有多个,那么输出 个数和 最大值。 -
例子1:
4 4
X X X X
X O O X
X O O X
X O X X
输出:3 1 5
说明 3 1 是 坐标 5 是最大值 -
例子2:
5 4
X X X X
X O O O
X X X X
X O O O
X X X X
输出: 2 3
说明:2是 有2个最大连通区域。 3是最大值 -
例子3:
6 4
X X X X
X O O O
X X X X
X O O O
X X X X
X X X O
输出:2 3
说明:2是 有2个最大连通区域。 3是最大值 -
例子4:
6 4
X X X X
X O O X
X X X X
X O O X
X X X X
X X X O
输出:5 3 1
说明 5 3 是坐标, 1是最大值。
代码:
m, n = map(int,input().split()) cell = [] for i in range(m): cell.append(input().split()) print(cell) # 感染函数,先感染后计算。别感染的时候就想要结果。咱不行,咱慢慢来。 def fun(cell, i, j, infect): # cell, i 和 j是当前要感染的位置 。infect是感染的值,是感染起始位置的坐标(i,j) # 递归结束条件 print("感染:",i, j, infect) if i < 0 or i > m -1 or j < 0 or j > n - 1: return if cell[i][j] == 'O': # 如果当前位置是 O 就 感染 cell[i][j] = infect # 分别从四个方向开始 感染 fun(cell, i + 1, j, infect) fun(cell, i - 1, j, infect) fun(cell, i, j + 1, infect) fun(cell, i, j - 1, infect) else: # 如果当前位置是 X 就 终止感染 return # 分别遍历第一行 最后一行 第一列 最后 一列 。查找入口 rukou = [] # 遍历第一行 感染 for i in range(n): # 如果当前是 O就开始感染。 print("第一行:",(0,i)) if cell[0][i] == 'O': fun(cell, 0, i, (0, i)) rukou.append((0, i)) # 遍历最后一行感染 for i in range(n): print("最后一行:",(m-1, i)) if cell[m-1][i] == 'O': fun(cell, m-1, i, (m-1, i)) rukou.append((m-1, i)) # 遍历第一列感染 for i in range(m): print("第一列:", (i, 0)) if cell[i][0] == 'O': fun(cell, i, 0, (i, 0)) rukou.append((i, 0)) # 遍历最后一列感染 for i in range(m): print("最后一列:", (i, n-1)) if cell[i][n-1] == 'O': fun(cell, i, n - 1, (i, n-1)) rukou.append((i, n -1)) print("感染之后: ", cell) print("入口点:", rukou) d = {} for i in rukou: d[i] = 0 print(d) # 遍历 for i in range(m): for j in range(n): if cell[i][j] != 'X' and cell[i][j] in d.keys(): if i == 0 or i == m -1 or j == 0 or j == n -1: # 如果当前点在边缘 ,但是 坐标 和 i,j 不等。说明不符合。移除 if (i, j) != cell[i][j]: d.pop((i,j)) else: d[cell[i][j]] = d[cell[i][j]] + 1 else: d[cell[i][j]] = d[cell[i][j]] + 1 print(d) print(len(d)) print(len(d.keys())) d2 = [] for key, value in d.items(): d2.append((key[0], key[1], value)) print(d2) if len(d2) == 0 : # 没有入口 print("None") elif len(d2) == 1: # 如果d只有一个,直接打印坐标和个数 item = d2[0] print("%s %s %s" % (item[0], item[1], item[2]) ) else: # d有多个。排序 d2 = sorted(d2, key=lambda x: (x[2]), reverse=True) print(d2) max_count = 0 d3 = [] # 只保留最大的 for item in d2: if item[2] >= max_count: # d3.append(item) max_count = item[2] print(d3) print("%s %s" % (len(d3), d3[0][2]) )
考挂了总结:
第一:太菜了
第二:太想一步到位了。 感染的时候别急着算结果。先感染在说。不然递归返回很难处理。
第三:考完之后没有压力做,但是 遍历 第一行第一列 最后一行最后一列 的 索引还是容易搞错。
挂了就挂了。说明自己不行,继续努力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!