【代码随想录算法训练营——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}")
相关推荐
hh随便起个名3 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
Dingdangcat865 小时前
城市交通多目标检测系统:YOLO11-MAN-FasterCGLU算法优化与实战应用_3
算法·目标检测·目标跟踪
xie_pin_an5 小时前
深入浅出 C 语言数据结构:从线性表到二叉树的实战指南
c语言·数据结构·图论
tang&5 小时前
滑动窗口:双指针的优雅舞步,征服连续区间问题的利器
数据结构·算法·哈希算法·滑动窗口
拼命鼠鼠5 小时前
【算法】矩阵链乘法的动态规划算法
算法·矩阵·动态规划
LYFlied6 小时前
【每日算法】LeetCode 17. 电话号码的字母组合
前端·算法·leetcode·面试·职场和发展
式5166 小时前
线性代数(八)非齐次方程组的解的结构
线性代数·算法·机器学习
橘颂TA7 小时前
【剑斩OFFER】算法的暴力美学——翻转对
算法·排序算法·结构与算法
叠叠乐7 小时前
robot_state_publisher 参数
java·前端·算法
hweiyu007 小时前
排序算法:冒泡排序
算法·排序算法