代码随想录算法训练营第56天 | 广搜和深搜应用
110.字符串接龙
https://kamacoder.com/problempage.php?pid=1183
代码随想录
https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路
105.有向图的完全可达性
https://kamacoder.com/problempage.php?pid=1177
代码随想录
https://www.programmercarl.com/kamacoder/0105.有向图的完全可达性.html
106.岛屿的周长
https://kamacoder.com/problempage.php?pid=1178
代码随想录
https://www.programmercarl.com/kamacoder/0106.岛屿的周长.html#思路
110.字符串接龙
-
step1:根据字符串建立图(邻接表);
-
step2:无向图求最短路径:广度优先搜索;
-
广搜逻辑:
- 一定要用队列:先进先出;
点击查看代码
from collections import deque def main(): dict_num = int(input()) source,target = input().split() dict_str = [source] for i in range(dict_num): dict_str.append(input()) dict_str.append(target) path_li = {} for i in range(len(dict_str)): path_li[i] = [] for j in range(len(dict_str)): if i==j: continue if pre_distance(dict_str[i],dict_str[j])==1: path_li[i].append(j) res = bfs_path(path_li,0,dict_num+1) print(res) def bfs_path(graph,start,end): queue = deque([(start,[start])]) visited = set() while queue: node,path = queue.popleft() if node==end: return len(path) if node not in visited: visited.add(node) if len(graph[node])==0: break return 0 for neighbor in graph[node]: if neighbor not in visited: queue.append((neighbor,path+[neighbor])) return [] def pre_distance(str1,str2): distance = 0 for i in range(len(str1)): if str1[i]!=str2[i]: distance+=1 return distance if __name__ == '__main__': main()
105.有向图的完全可达性
-
两种方式进行深搜:
- 当前值执行;
当前值执行
def main(): n,k = map(int,input().split()) graph = {i:[] for i in range(n+1)} for i in range(k): s,t = map(int,input().split()) graph[s].append(t) visited = [0]*(n+1) dfs(graph,visited,1) for i in range(1,n+1): if visited[i]==0: print("-1") return print("1") def dfs(graph,visited,node): if visited[node]==1: return visited[node] =1 if len(graph[node])!=0: for key in graph[node]: dfs(graph,visited,key) if __name__ == '__main__': main()
- 处理过当前值循环;(和BFS的位置相同)
处理过当前值循环
from collections import deque def main(): n,k = map(int,input().split()) graph = {i:[] for i in range(n+1)} for i in range(k): s,t = map(int,input().split()) graph[s].append(t) visited = [0]*(n+1) visited[1] = 1 bfs(graph,visited,1) for i in range(1,n+1): if visited[i]==0: print("-1") return print("1") def dfs(graph,visited,node): visited[node] =1 if len(graph[node])!=0: for key in graph[node]: if visited[key]==0: dfs(graph,visited,key) def bfs(graph,visited,node): queue = deque([node]) while queue: curr =queue.popleft() for key in graph[curr]: if visited[key]==0: visited[key]=1 queue.append(key) if __name__ == '__main__': main()
106. 岛屿的周长
-
统计岛屿的周长;
-
方法一:所有块的数量4-重合数量2
点击查看代码
def main(): n,m = map(int,input().split()) graph = [[0]*m for _ in range(n)] for i in range(n): data = input().split() for j in range(m): graph[i][j] = int(data[j]) directions = [[0,1],[0,-1]] bound = 0 combine = 0 for i in range(n): for j in range(m): if graph[i][j]==1: bound+=1 if i-1>=0 and graph[i-1][j]==1: combine+=1 if j-1>=0 and graph[i][j-1]==1: combine+=1 print(str(bound*4-combine*2)) if __name__ == '__main__': main()
-
方法二:遇到了边缘块 统计边缘数量即可
点击查看代码
def main(): n,m = map(int,input().split()) graph = [[0]*m for _ in range(n)] for i in range(n): data = input().split() for j in range(m): graph[i][j] = int(data[j]) directions = [[0,1],[0,-1],[1,0],[-1,0]] bound = 0 for i in range(n): for j in range(m): if graph[i][j]==1: for dir_ in directions: nextx = i+dir_[0] nexty = j+dir_[1] if nextx<0 or nextx>=len(graph) or nexty<0 or nexty>=len(graph[0]): bound+=1 elif graph[nextx][nexty]==0: bound+=1 else: continue print(bound) if __name__ == '__main__': main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构