【代码随想录算法训练营——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}")
相关推荐
freexyn10 分钟前
Matlab入门自学七十四:坐标系转换,直角坐标、极坐标和球坐标的转换
开发语言·算法·matlab
咱就是说不配啊17 分钟前
3.20打卡day34
数据结构·c++·算法
小张会进步22 分钟前
数组:二维数组
java·javascript·算法
佑白雪乐40 分钟前
LCR 175. 计算二叉树的深度
算法·深度优先
阿Y加油吧1 小时前
力扣打卡day07——最大子数组和、合并区间
算法
想吃火锅10051 小时前
【leetcode】105. 从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
2401_831824961 小时前
嵌入式C++驱动开发
开发语言·c++·算法
靠沿1 小时前
【优选算法】专题十八——BFS解决拓扑排序问题
算法·宽度优先
cui_ruicheng1 小时前
C++数据结构进阶:哈希表实现
数据结构·c++·算法·哈希算法·散列表
li星野1 小时前
[特殊字符] 模拟试卷一:C++核心与系统基础(90分钟)答案版
开发语言·c++·算法