卡码网题目链接
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}")