【代码随想录算法训练营——Day53】图论——110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长

卡码网题目链接

https://kamacoder.com/problempage.php?pid=1183

https://kamacoder.com/problempage.php?pid=1177

https://kamacoder.com/problempage.php?pid=1178

题解
110.字符串接龙

因为接连做两天的题,有点放弃治疗。感觉这题不会。

看题解,原来要画图。关于做题原理有很多细节,看题解。

105.有向图的完全可达性

用邻接矩阵存储图,从1开始出发用一次dfs,同时用visited数组记录是否可达,最后判断visited是否都为true即可。

106.岛屿的周长

相当于是统计相邻的1的个数。我这份dfs代码怎么改都不对,不知道问题在哪里。

终于找到原因了,原来是双层循环没有跳出。

代码

python 复制代码
#110.字符串接龙


python 复制代码
#105.有向图的完全可达性
def dfs(graph, visited, y):
    visited[y] = True
    for i in range(1, len(graph)):
        if graph[y][i] == 1 and visited[i] == False:
            dfs(graph, visited, i)

if __name__ == "__main__":
    n, m = map(int, input().split())
    graph = [[0] * (n + 1) for _ in range(n + 1)]
    for i in range(m):
        s, t = map(int, input().split())
        graph[s][t] = 1
    visited = [False] * (n + 1)
    dfs(graph, visited, 1)
    flag = True
    for i in range(1, n + 1):
        if visited[i] == False:
            flag = False
    if flag:
        print(1)
    else:
        print(-1)
python 复制代码
#106.岛屿的周长
#错误代码
point = [[1, 0], [0, 1], [-1, 0], [0, -1]]
result = 0
def dfs(graph, visited, x, y):
    global result
    visited[x][y] = True
    for i in range(4):
        nextx = x + point[i][0]
        nexty = y + point[i][1]
        if nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):
            result += 1
        elif graph[nextx][nexty] == 0:
            result += 1
        elif graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:
            dfs(graph, visited, nextx, nexty)

if __name__ == "__main__":
    n, m = map(int, input().split())
    graph = []
    for i in range(n):
        graph.append(list(map(int, input().split())))
    visited = [[False] * m for _ in range(n)]
    flag = True
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:
                dfs(graph, visited, i, j)
                flag = False
                break
        if not flag:
            break
    print(result)

#deeoseek加调试代码
point = [[1, 0], [0, 1], [-1, 0], [0, -1]]
result = 0

def dfs(graph, visited, x, y):
    global result
    visited[x][y] = True
    print(f"访问格子({x},{y})")
    
    for i in range(4):
        nextx = x + point[i][0]
        nexty = y + point[i][1]
        direction = ["下", "右", "上", "左"][i]
        
        if nextx < 0 or nextx >= len(graph) or nexty < 0 or nexty >= len(graph[0]):
            result += 1
            print(f"  {direction}方向: 地图边界,周长+1 → {result}")
        elif graph[nextx][nexty] == 0:
            result += 1
            print(f"  {direction}方向: 遇到水域,周长+1 → {result}")
        elif graph[nextx][nexty] == 1 and not visited[nextx][nexty]:
            print(f"  {direction}方向: 递归到({nextx},{nexty})")
            dfs(graph, visited, nextx, nexty)

if __name__ == "__main__":
    n, m = 5, 5
    graph = [
        [0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0], 
        [0, 1, 1, 1, 0],
        [0, 1, 1, 1, 0],
        [0, 0, 0, 0, 0]
    ]
    visited = [[False] * m for _ in range(n)]
    
    # 从(1,1)开始
    dfs(graph, visited, 1, 1)
    print(f"最终结果: {result}")
相关推荐
安迪西嵌入式7 小时前
数据平滑处理算法03——中心移动平均
java·前端·算法
CN-Dust8 小时前
【C++】2025CSP-J第二轮真题及解析
开发语言·c++·算法
贝塔实验室8 小时前
译码器的结构
驱动开发·算法·网络安全·fpga开发·硬件工程·信息与通信·信号处理
夏鹏今天学习了吗8 小时前
【LeetCode热题100(57/100)】括号生成
算法·leetcode·职场和发展
三花聚顶<>8 小时前
310.力扣LeetCode_ 最小高度树_直径法_DFS
算法·leetcode·深度优先
mit6.8248 小时前
[VT-Refine] 仿真平台 | Isaac Gym引擎 | easysim-envs配置
算法
温柔一只鬼.8 小时前
Java数组
java·开发语言·算法
努力学算法的蒟蒻8 小时前
day04(11.2)——leetcode面试经典150
算法·leetcode
CoovallyAIHub9 小时前
视觉语言模型(VLM)深度解析:如何用它来处理文档?
深度学习·算法·计算机视觉