【代码随想录算法训练营——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}")
相关推荐
清木铎1 小时前
leetcode_day4_筑基期_《绝境求生》
算法
清木铎1 小时前
leetcode_day10_筑基期_《绝境求生》
算法
j_jiajia1 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法
源代码•宸2 小时前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
Jasmine_llq3 小时前
《CF280C Game on Tree》
数据结构·算法·邻接表·深度优先搜索(dfs)·树的遍历 + 线性累加统计
小棠师姐4 小时前
支持向量机(SVM)入门:超平面与核函数的通俗解释
算法·python机器学习·支持向量机svm·超平面可视化·核函数应用
im_AMBER4 小时前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
今儿敲了吗4 小时前
01|多项式输出
c++·笔记·算法
Xの哲學5 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
AlenTech5 小时前
200. 岛屿数量 - 力扣(LeetCode)
算法·leetcode·职场和发展