当前位置: 首页 > news >正文

代码随想录第41天:图论2(岛屿系列)

一、岛屿数量(Kamacoder 99)

深度优先搜索:

# 定义四个方向:右、下、左、上,用于 DFS 中四向遍历
direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度优先遍历并标记相邻陆地:param grid: 二维网格:param visited: 是否访问过的标记表:param x: 当前所在的行坐标:param y: 当前所在的列坐标"""for dx, dy in direction:next_x = x + dxnext_y = y + dy# 判断是否越界if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 如果相邻格子是陆地且未被访问,标记并递归继续 DFSif not visited[next_x][next_y] and grid[next_x][next_y] == 1:visited[next_x][next_y] = Truedfs(grid, visited, next_x, next_y)if __name__ == '__main__':  # 输入行数 n 和列数 mn, m = map(int, input().split())# 构建网格:n 行,每行 m 个整数(0 表示水,1 表示陆地)grid = []for _ in range(n):grid.append(list(map(int, input().split())))# 初始化访问标记表,初始均为 Falsevisited = [[False] * m for _ in range(n)]res = 0  # 统计岛屿数量(连通块个数)for i in range(n):for j in range(m):# 如果当前位置是陆地,且未被访问过,则为新的岛屿if grid[i][j] == 1 and not visited[i][j]:res += 1  # 新岛屿计数 +1visited[i][j] = True  # 标记起点已访问dfs(grid, visited, i, j)  # DFS 遍历整块陆地# 输出岛屿总数print(res)

广度优先搜索:只要加入队列,立即标记该节点走过

from collections import deque  # 使用 deque 作为队列,提高效率# 定义四个方向:右、下、左、上
directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]def bfs(grid, visited, x, y):"""使用广度优先搜索(BFS)遍历并标记一整块陆地:param grid: 输入的地图(二维数组):param visited: 访问标记矩阵:param x, y: 起始坐标(陆地)"""que = deque()que.append([x, y])             # 将起始节点加入队列visited[x][y] = True           # 标记该点已访问while que:cur_x, cur_y = que.popleft()  # 弹出当前处理的节点for dx, dy in directions:     # 遍历四个方向next_x = cur_x + dxnext_y = cur_y + dy# 越界检查if next_x < 0 or next_y < 0 or next_x >= len(grid) or next_y >= len(grid[0]):continue# 如果是未访问的陆地,则加入队列并标记为已访问if not visited[next_x][next_y] and grid[next_x][next_y] == 1: visited[next_x][next_y] = Trueque.append([next_x, next_y])def main():# 输入网格行数 n 和列数 mn, m = map(int, input().split())# 读取 n 行数据构造 gridgrid = []for i in range(n):grid.append(list(map(int, input().split())))# 初始化访问标记数组visited = [[False] * m for _ in range(n)]res = 0  # 记录岛屿数量for i in range(n):for j in range(m):# 遇到未访问的陆地,开始 BFS,并增加岛屿计数if grid[i][j] == 1 and not visited[i][j]:res += 1bfs(grid, visited, i, j)print(res)  # 输出岛屿数量if __name__ == "__main__":main()

二、岛屿的最大面积(Kamacoder 100)

DFS:

# 四个方向:右、下、左、上(用于搜索相邻的格子)
position = [[0, 1], [1, 0], [0, -1], [-1, 0]]count = 0  # 用于记录当前连通块的陆地面积(全局变量)def dfs(grid, visited, x, y):"""使用深度优先搜索(DFS)标记一整块陆地并统计面积:param grid: 输入地图(二维矩阵):param visited: 访问标记矩阵:param x, y: 当前坐标"""global count  # 使用全局变量记录当前连通块的面积for dx, dy in position:cur_x = x + dxcur_y = y + dy# 越界检查if cur_x < 0 or cur_x >= len(grid) or cur_y < 0 or cur_y >= len(grid[0]):continue# 若是未访问的陆地,递归访问并增加面积if not visited[cur_x][cur_y] and grid[cur_x][cur_y] == 1:visited[cur_x][cur_y] = Truecount += 1dfs(grid, visited, cur_x, cur_y)# 输入网格的行列数 n 行 m 列
n, m = map(int, input().split())# 构造地图(邻接矩阵)
grid = []
for _ in range(n):grid.append(list(map(int, input().split())))# 构造访问矩阵,记录哪些节点已访问
visited = [[False] * m for _ in range(n)]result = 0  # 记录最大陆地面积(即最大连通块中1的数量)# 遍历每一个格子
for i in range(n):for j in range(m):# 遇到一个未访问的陆地,开始 DFS 并更新最大面积if grid[i][j] == 1 and not visited[i][j]:count = 1  # 初始化当前连通块的面积visited[i][j] = True  # 标记当前格子已访问dfs(grid, visited, i, j)result = max(result, count)  # 更新最大面积# 输出最大陆地面积
print(result)

BFS:

from collections import deque# 四个方向:右、下、左、上(用于搜索相邻格子)
position = [[0, 1], [1, 0], [0, -1], [-1, 0]]count = 0  # 记录当前连通块面积(使用全局变量)def bfs(grid, visited, x, y):"""广度优先搜索,对一整块陆地进行标记并统计面积:param grid: 地图矩阵:param visited: 访问标记矩阵:param x, y: 当前陆地坐标"""global count  # 使用全局变量记录当前连通块面积que = deque()que.append([x, y])  # 将起点入队while que:cur_x, cur_y = que.popleft()  # 弹出队首元素# 遍历四个方向for dx, dy in position:next_x = cur_x + dxnext_y = cur_y + dy# 越界处理if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 如果是未访问的陆地,则入队并更新访问记录与面积if grid[next_x][next_y] == 1 and not visited[next_x][next_y]:visited[next_x][next_y] = Truecount += 1que.append([next_x, next_y])# 输入地图尺寸 n 行 m 列
n, m = map(int, input().split())# 构造地图矩阵(邻接矩阵)
grid = []
for i in range(n):grid.append(list(map(int, input().split())))# 构造访问标记矩阵
visited = [[False] * m for _ in range(n)]result = 0  # 记录所有陆地块中面积最大的那一块# 遍历地图
for i in range(n):for j in range(m):# 如果当前是未访问的陆地,则开始BFSif grid[i][j] == 1 and not visited[i][j]:count = 1  # 初始面积为1(当前格子)visited[i][j] = True  # 标记已访问bfs(grid, visited, i, j)  # 广度优先遍历整块陆地result = max(result, count)  # 更新最大面积# 输出最大陆地面积
print(result)

三、孤岛的总面积(Kamacoder 101)

DFS:先遍历边界的陆地将他们变成海洋,然后再统计非边界的“孤岛”面积。

# 四个方向:下、右、上、左
position = [[1, 0], [0, 1], [-1, 0], [0, -1]]
count = 0  # 用于统计当前岛屿面积def dfs(grid, x, y):"""深度优先搜索,沉没当前岛屿,统计其面积"""global countgrid[x][y] = 0  # 将陆地“沉没”为水count += 1for i, j in position:next_x = x + inext_y = y + j# 越界处理if next_x < 0 or next_y < 0 or next_x >= len(grid) or next_y >= len(grid[0]):continue# 如果是陆地,递归搜索if grid[next_x][next_y] == 1: dfs(grid, next_x, next_y)# 输入读取
n, m = map(int, input().split())
grid = []
for _ in range(n):grid.append(list(map(int, input().split())))# 第一步:清除所有接触边缘的岛屿
for i in range(n):if grid[i][0] == 1:        # 左边界dfs(grid, i, 0)if grid[i][m - 1] == 1:    # 右边界dfs(grid, i, m - 1)for j in range(m):if grid[0][j] == 1:        # 上边界dfs(grid, 0, j)if grid[n - 1][j] == 1:    # 下边界dfs(grid, n - 1, j)# 第二步:统计内部的孤岛面积
count = 0  # 重置计数器
for i in range(n):for j in range(m):if grid[i][j] == 1:dfs(grid, i, j)print(count)

这里需要注意:统计内部的孤岛面积之前要把计数器count清零,因为遍历边界的时候count在dfs函数内部有赋值操作。

BFS:

from collections import deque# 定义四个方向:右、下、左、上(用于遍历相邻的陆地)
direct = [[0, 1], [1, 0], [0, -1], [-1, 0]]count = 0  # 用于统计孤岛的总面积def bfs(grid, x, y):"""广度优先搜索:从 (x, y) 开始,将连通的陆地单元格全部“淹掉”(设为0)并累计面积"""global countque = deque()que.append([x, y])grid[x][y] = 0  # 将当前格子标记为已访问(水)count += 1      # 当前陆地面积 +1while que:x, y = que.popleft()for dx, dy in direct:next_x = x + dxnext_y = y + dy# 越界检查if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 如果是陆地,则加入队列,继续“淹掉”if grid[next_x][next_y] == 1:que.append([next_x, next_y])grid[next_x][next_y] = 0count += 1  # 每找到一个陆地格子,面积 +1# 读取输入
n, m = map(int, input().split())  # 行数、列数
grid = []
for _ in range(n):grid.append(list(map(int, input().split())))  # 构建地图矩阵# 第一步:清除所有与边界相连的岛屿(不计入孤岛)
for i in range(n):if grid[i][0] == 1:bfs(grid, i, 0)if grid[i][m - 1] == 1:bfs(grid, i, m - 1)
for j in range(m):if grid[0][j] == 1:bfs(grid, 0, j)if grid[n - 1][j] == 1:bfs(grid, n - 1, j)# 第二步:正式统计所有内部孤岛的总面积
count = 0  # 重置计数器
for i in range(n):for j in range(m):if grid[i][j] == 1:bfs(grid, i, j)# 输出所有孤岛的总面积
print(count)

四、沉没孤岛(Kamacoder 102)

DFS:

def dfs(grid, x, y):# 将当前位置标记为2,表示访问过并来自边界的陆地grid[x][y] = 2directions = [(-1, 0), (0, -1), (1, 0), (0, 1)]  # 上、左、下、右四个方向for dx, dy in directions:nextx, nexty = x + dx, y + dy# 如果越界,则跳过if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continue# 如果是水(0)或已经标记过的陆地(2),也跳过if grid[nextx][nexty] == 0 or grid[nextx][nexty] == 2:continue# 继续向相邻陆地递归搜索dfs(grid, nextx, nexty)def main():n, m = map(int, input().split())  # 输入行列数# 读取整个地图矩阵grid = [[int(x) for x in input().split()] for _ in range(n)]# 步骤一:处理边界上的陆地,使用DFS将它们和相连的陆地标记为2for i in range(n):if grid[i][0] == 1:        # 左边界dfs(grid, i, 0)if grid[i][m - 1] == 1:    # 右边界dfs(grid, i, m - 1)for j in range(m):if grid[0][j] == 1:        # 上边界dfs(grid, 0, j)if grid[n - 1][j] == 1:    # 下边界dfs(grid, n - 1, j)# 步骤二和三:# 遍历所有格子for i in range(n):for j in range(m):if grid[i][j] == 1:# 还剩下的1是被水包围的孤岛,置为0(清除孤岛)grid[i][j] = 0elif grid[i][j] == 2:# 原本在边缘或连通边缘的陆地,恢复为1grid[i][j] = 1# 打印最终结果矩阵for row in grid:print(' '.join(map(str, row)))if __name__ == "__main__":main()

BFS:

from collections import deque# 输入地图的行列数
n, m = list(map(int, input().split()))# 读取地图网格 g
g = []
for _ in range(n):row = list(map(int, input().split()))g.append(row)# 定义四个方向(上下左右)
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
count = 0  # 可选统计被访问的节点数(未实际使用)# 广度优先搜索函数,用于将与边界连通的陆地标记
def bfs(r, c, mode):global count q = deque()q.append((r, c))  # 起始位置加入队列count += 1while q:r, c = q.popleft()if mode:g[r][c] = 2  # 标记为已访问(与边界相连)for di in directions:next_r = r + di[0]next_c = c + di[1]# 越界跳过if next_c < 0 or next_c >= m or next_r < 0 or next_r >= n:continue# 若为陆地(1),则入队继续扩展if g[next_r][next_c] == 1:q.append((next_r, next_c))if mode:g[r][c] = 2  # 标记当前格子为边界连通count += 1# 遍历边界四周,找到所有与边界连通的陆地,并进行 BFS 标记
for i in range(n):if g[i][0] == 1: bfs(i, 0, True)        # 左边界if g[i][m - 1] == 1: bfs(i, m - 1, True)  # 右边界for j in range(m):if g[0][j] == 1: bfs(0, j, True)        # 上边界if g[n - 1][j] == 1: bfs(n - 1, j, True)  # 下边界# 处理最终输出:
# - 被标记为 2 的陆地(与边界连通)恢复为 1
# - 其余陆地为封闭岛屿,置为 0(沉没)
for i in range(n):for j in range(m):if g[i][j] == 2:g[i][j] = 1else:g[i][j] = 0# 打印最终地图结果
for row in g:print(" ".join(map(str, row)))

五、水流问题(Kamacoder 103)

  • 每个 DFS 逻辑是“水可以流向高度大于等于自己的相邻格子”。

  • 从两个边界(上/左、下/右)出发分别进行 DFS。

  • 最终取两个集合交集,得到的是能从两边都能流到的点。

first = set()   # 记录能从第一边界(上边和左边)流到的点
second = set()  # 记录能从第二边界(下边和右边)流到的点# 四个方向:上、右、下、左
directions = [[-1, 0], [0, 1], [1, 0], [0, -1]]def dfs(i, j, graph, visited, side):# 如果已经访问过,直接返回if visited[i][j]:return# 标记已访问visited[i][j] = Trueside.add((i, j))  # 加入当前方向的集合中# 遍历四个方向for x, y in directions:new_x = i + xnew_y = j + y# 保证下标合法且水能从当前格子流向相邻格子(即相邻格子值 >= 当前值)if (0 <= new_x < len(graph)and 0 <= new_y < len(graph[0])and int(graph[new_x][new_y]) >= int(graph[i][j])):dfs(new_x, new_y, graph, visited, side)def main():global firstglobal secondN, M = map(int, input().strip().split())  # 输入矩阵的行数和列数graph = []for _ in range(N):row = input().strip().split()graph.append(row)  # 构造二维矩阵# 第一步:从第一边界(上边和左边)出发进行 DFSvisited = [[False] * M for _ in range(N)]for i in range(M):  # 上边界dfs(0, i, graph, visited, first)for i in range(N):  # 左边界dfs(i, 0, graph, visited, first)# 第二步:从第二边界(下边和右边)出发进行 DFSvisited = [[False] * M for _ in range(N)]for i in range(M):  # 下边界dfs(N - 1, i, graph, visited, second)for i in range(N):  # 右边界dfs(i, M - 1, graph, visited, second)# 第三步:找出同时能从两个边界流通的交集点res = first & second# 打印所有可以从两个边界都流通到的坐标点for x, y in res:print(f"{x} {y}")if __name__ == "__main__":main()

六、建造最大岛屿(Kamacoder 104)

  • 把每个岛屿编号并计算面积。

  • 遍历所有水域格子,尝试变成陆地并连接周围不同的岛屿。

  • 记录最大可能岛屿面积。

  • 边界处理和重复统计都已通过 visitedset 控制。

import collections# 四个方向:上、右、左、下
directions = [[-1, 0], [0, 1], [0, -1], [1, 0]]area = 0  # 当前岛屿的面积def dfs(i, j, grid, visited, num):"""深度优先搜索,将岛屿上的所有陆地格子标记为同一个编号num,并统计当前岛屿的总面积"""global areaif visited[i][j]:returnvisited[i][j] = Truegrid[i][j] = num  # 用编号num标记该岛屿area += 1  # 累加岛屿面积for x, y in directions:new_x = i + xnew_y = j + y# 判断是否在边界内且是未访问的陆地if (0 <= new_x < len(grid)and 0 <= new_y < len(grid[0])and grid[new_x][new_y] == "1"):dfs(new_x, new_y, grid, visited, num)def main():global areaN, M = map(int, input().strip().split())  # 读入行列数grid = []for _ in range(N):grid.append(input().strip().split())  # 读取每一行visited = [[False] * M for _ in range(N)]  # 记录访问情况rec = collections.defaultdict(int)  # 记录每个岛屿编号对应的面积cnt = 2  # 编号从2开始,避免与"0"(水)和"1"(未编号陆地)混淆for i in range(N):for j in range(M):if grid[i][j] == "1":area = 0dfs(i, j, grid, visited, cnt)rec[cnt] = area  # 保存当前岛屿面积cnt += 1res = 0  # 最终最大岛屿面积for i in range(N):for j in range(M):if grid[i][j] == "0":  # 尝试将水变成陆地max_island = 1  # 当前面积初始为1(假设这里是陆地)v = set()  # 防止重复统计相邻岛屿for x, y in directions:new_x = i + xnew_y = j + yif (0 <= new_x < len(grid)and 0 <= new_y < len(grid[0])and grid[new_x][new_y] != "0"and grid[new_x][new_y] not in v):max_island += rec[grid[new_x][new_y]]v.add(grid[new_x][new_y])res = max(res, max_island)if res == 0:# 如果没有水可变为陆地,返回最大岛屿面积return max(rec.values())return resif __name__ == "__main__":print(main())

BFS:

from typing import List
from collections import defaultdictclass Solution:def __init__(self):# 定义四个方向(上、下、左、右)self.direction = [(1,0),(-1,0),(0,1),(0,-1)]self.res = 0              # 存放结果:最大可能的连通面积self.count = 0            # 当前岛屿的面积计数器self.idx = 1              # 当前岛屿的编号,从2开始(因为1已经是初始岛屿标记)self.count_area = defaultdict(int)  # 记录每个岛屿编号对应的面积def max_area_island(self, grid: List[List[int]]) -> int:if not grid or len(grid) == 0 or len(grid[0]) == 0:return 0# Step 1: DFS 标记每个岛屿为不同编号(从 2 开始),并记录每个岛屿的面积for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == 1:self.count = 0self.idx += 1self.dfs(grid, i, j)  # 递归标记岛屿# Step 2: 统计每个编号的面积self.check_area(grid)# Step 3: 尝试将一个 0 变成 1,看是否能连接多个岛屿,获取最大可能面积if self.check_largest_connect_island(grid=grid):return self.res + 1  # +1 是把0变成1后的面积增加return max(self.count_area.values())  # 若没有0,返回最大岛屿面积def dfs(self, grid, row, col):# 使用 DFS 给岛屿打编号,并统计面积grid[row][col] = self.idxself.count += 1for dr, dc in self.direction:_row = dr + row _col = dc + col if 0 <= _row < len(grid) and 0 <= _col < len(grid[0]) and grid[_row][_col] == 1:self.dfs(grid, _row, _col)returndef check_area(self, grid):# 遍历整张图,统计每个岛屿编号的面积(包含编号为 2 及以上)m, n = len(grid), len(grid[0])for row in range(m):for col in range(n):self.count_area[grid[row][col]] = self.count_area.get(grid[row][col], 0) + 1returndef check_largest_connect_island(self, grid):# 检查每个值为0的位置,看是否能连接多个岛屿m, n = len(grid), len(grid[0])has_connect = False  # 是否存在0可用作连接点for row in range(m):for col in range(n):if grid[row][col] == 0:has_connect = Truearea = 0visited = set()  # 避免重复计算同一编号岛屿for dr, dc in self.direction:_row = row + dr _col = col + dcif (0 <= _row < len(grid)and 0 <= _col < len(grid[0])and grid[_row][_col] != 0and grid[_row][_col] not in visited):visited.add(grid[_row][_col])area += self.count_area[grid[_row][_col]]self.res = max(self.res, area)  # 更新最大面积return has_connect  # 返回是否存在可以转换的0def main():# 输入处理m, n = map(int, input().split())grid = []for i in range(m):grid.append(list(map(int, input().split())))# 创建对象并调用主函数sol = Solution()print(sol.max_area_island(grid))if __name__ == '__main__':main()

七、岛屿的周长(Kamacoder 106)

def main():import sysinput = sys.stdin.readdata = input().split()# 读取行数 n 和列数 mn = int(data[0])m = int(data[1])# 初始化 grid 网格grid = []index = 2  # 从第3个数据开始是地图数据for i in range(n):# 读取每一行的 m 个数据grid.append([int(data[index + j]) for j in range(m)])index += msum_land = 0  # 记录陆地格子的总数cover = 0     # 记录相邻的陆地边对数(每对相邻边减少2个周长)for i in range(n):for j in range(m):if grid[i][j] == 1:sum_land += 1  # 统计陆地格子数量# 检查上方是否是陆地,如果是,说明这两个格子共享一条边if i - 1 >= 0 and grid[i - 1][j] == 1:cover += 1# 检查左方是否是陆地,同样共享一条边if j - 1 >= 0 and grid[i][j - 1] == 1:cover += 1# 不检查下方和右方,是为了避免重复计算边界# 每个陆地格子原始贡献 4 个边界,所有相邻对共享 2 个边界result = sum_land * 4 - cover * 2print(result)if __name__ == "__main__":main()

相关文章:

代码随想录第41天:图论2(岛屿系列)

一、岛屿数量&#xff08;Kamacoder 99&#xff09; 深度优先搜索&#xff1a; # 定义四个方向&#xff1a;右、下、左、上&#xff0c;用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…...

C语言复习--柔性数组

柔性数组是C99中提出的一个概念.结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员。 格式大概如下 struct S { int a; char b; int arr[];//柔性数组 }; 也可以写成 struct S { int a; char b; int arr[0];//柔性数组 }; …...

《Python星球日记》 第55天:迁移学习与预训练模型

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、迁移学习基础1. 什么是迁移学习&#xff1f;2. 迁移学习的优势3. 迁移学习的…...

Python项目75:PyInstaller+Tkinter+subprocess打包工具1.0(安排 !!)

这个打包工具包含以下功能&#xff1a; 1.主要功能&#xff1a;选择Python脚本文件&#xff0c;设置打包选项&#xff08;单文件打包、无控制台窗口&#xff09;&#xff0c;自定义程序图标&#xff0c;指定输出目录&#xff0c;实时显示打包日志。 2.自适应布局改进&#xff…...

互联网大厂Java面试实录:从基础到微服务的深度考察

互联网大厂Java面试实录&#xff1a;从基础到微服务的深度考察 面试场景 面试官&#xff1a;风清扬&#xff08;严肃且技术深厚&#xff09; 求职者&#xff1a;令狐冲&#xff08;技术扎实但偶尔含糊&#xff09; 第一轮&#xff1a;Java基础与框架 风清扬&#xff1a;令狐…...

学习黑客5 分钟深入浅出理解Linux进程管理

5 分钟深入浅出理解Linux进程管理 &#x1f5a5;️ 大家好&#xff01;今天我们将探索Linux系统中的进程管理——这是理解系统运行机制和进行安全分析的基础知识。在TryHackMe平台上进行网络安全学习时&#xff0c;了解进程如何工作以及如何监控和控制它们&#xff0c;对于识别…...

Kubernetes应用发布方式完整流程指南

Kubernetes&#xff08;K8s&#xff09;作为容器编排领域的核心工具&#xff0c;其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例&#xff0c;详细讲解从配置编写到高级发布的完整流程&#xff0c;帮助开发者掌握Kubernetes应用部署的核心步…...

JVM——即时编译器的中间表达形式

中间表达形式&#xff08;IR&#xff09;&#xff1a;编译器的核心抽象层 1. IR的本质与作用 在编译原理的体系中&#xff0c;中间表达形式&#xff08;Intermediate Representation, IR&#xff09;是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR&#xff0c;而后…...

Js 判断浏览器cookie 是否启用

验证时 google浏览器 135.0.7049.117 不生效 cookie.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>Cookie 检测</title> </head> <body><h1>检测是否启用 Cookie<…...

数字相机的快门结构

数字相机(DC/DSLR等)的快门结构和传统相机有所不同,除了机械快门以外,还存在电子快门,实际上是二者的混合体。我写这篇文章大概介绍一下数字相机的快门结构,希望能抛砖引玉。 要讨论数字相机的快门结构,首先先要了解一下数字相机的结构分类,根据成像原理不同,数字相机大…...

LeetCode --- 448 周赛

题目列表 3536. 两个数字的最大乘积 3537. 填充特殊网格 3538. 合并得到最小旅行时间 3539. 魔法序列的数组乘积之和 一、两个数字的最大乘积 由于数据都是正数&#xff0c;所以乘积最大的两个数&#xff0c;本质就是找数组中最大的两个数即可&#xff0c;可以排序后直接找到…...

添加物体.

在cesium中我们可以添加物体进入地图.我们以广州塔为例 //生成广州塔的位置var position2 Cesium.Cartesian3.fromDegrees(113.3191,23.109,100)viewer.camera.setView({//指定相机位置destination: position2, 运行后如图 我们使用cesium官网提供的代码为广州塔在地图上标点…...

ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例

ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例 在现代工业自动化系统中&#xff0c;设备之间的互联互通至关重要。Profibus DP和Modbus TCP是两种常见的通信协议&#xff0c;分别应用于不同的场景。为了实现这两种协议的相互转换&#xff0c;Profibus …...

Yocto中`${S}`和`${WORKDIR}`的联系与区别

在Yocto项目中,${S}和${WORKDIR}是构建过程中两个核心路径变量,它们的关系及用途如下: 定义与层级关系${WORKDIR}(工作目录) 是Recipe所有任务执行的基础目录,路径结构为: build/tmp/work/<arch>/<recipe-name>/<version>/。 该目录包含源码解压后的所…...

CDGP历次主观题真题回忆

(一)【论述】 1如何设计企业的数据安全体系?活动+方法+DSMM 2如何管理公司混乱的数据质量?活动+遵循原则+建立质量维度+质量改进生命周期+高阶指标。...

Java学习手册:Spring Cloud 组件详解

一、服务发现组件 - Eureka 核心概念 &#xff1a;Eureka 是一个服务发现组件&#xff0c;包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册中心&#xff0c;负责维护服务实例的注册信息&#xff1b;Eureka Client 则是集成在应用中的客户端&#xff0…...

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…...

sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离

前言 sensitive-word-admin 最初的定位是让大家知道如何使用 sensitive-word&#xff0c;所以开始想做个简单的例子。 不过秉持着把一个工具做好的原则&#xff0c;也收到很多小伙伴的建议。 v2.0.0 在 ruoyi-vue&#xff08;也非常感谢若依作者多年来的无私奉献&#xff09…...

HTML属性

HTML&#xff08;HyperText Markup Language&#xff09;是网页开发的基石&#xff0c;而属性&#xff08;Attribute&#xff09;则是HTML元素的重要组成部分。它们为标签提供附加信息&#xff0c;控制元素的行为、样式或功能。本文将从基础到进阶&#xff0c;全面解析HTML属性…...

计算机网络 4-1 网络层(网络层的功能)

【考纲内容】 &#xff08;一&#xff09;网络层的功能 异构网络互连&#xff1b;路由与转发&#xff1b;SDN基本概念&#xff1b;拥塞控制 &#xff08;二&#xff09;路由算法 静态路由与动态路由&#xff1b;距离-向量路由算法&#xff1b;链路状态路由算法&#xff1b;层…...

《算法导论(第4版)》阅读笔记:p17-p27

《算法导论(第4版)》学习第 10 天&#xff0c;p17-p27 总结&#xff0c;总计 11 页。 一、技术总结 1. insertion sort (1)keys The numbers to be sorted are also known as the keys(要排序的数称为key)。 第 n 次看插入排序&#xff0c;这次有两个地方感触比较深&#…...

C++中线程安全的对多个锁同时加锁

C中线程安全的对多个锁同时加锁 C中线程安全的对两个锁同时加锁 C中线程安全的对两个锁同时加锁 参考文档&#xff1a;https://llfc.club/articlepage?id2UVOC0CihIdfguQFmv220vs5hAG 如果我们现在有一个需要互斥访问的变量 big_object&#xff0c;它的定义如下&#xff1a; …...

子串简写(JAVA)一维前缀和, 蓝桥杯

这个题用前缀和&#xff0c;开两个数组&#xff0c;一个存前n个字符数据的c1的数字个数&#xff0c;另一个前n个字符c2的数字个数&#xff0c;然后遍历一次加起来&#xff0c;有一个测试点没过去&#xff0c;把那个存最后数的换成long&#xff0c;应该是这题数据范围给的不对&a…...

数据库故障排查全攻略:从实战案例到体系化解决方案

一、引言&#xff1a;数据库故障为何是技术人必须攻克的 "心腹大患" 在数字化时代&#xff0c;数据库作为企业核心数据资产的载体&#xff0c;其稳定性直接决定业务连续性。据 Gartner 统计&#xff0c;企业每小时数据库 downtime 平均损失高达 56 万美元&#xff0…...

vllm笔记

目录 vllm简介vllm解决了哪些问题&#xff1f;1. **瓶颈&#xff1a;KV 缓存内存管理低效**2. **瓶颈&#xff1a;并行采样和束搜索中的内存冗余**3. **瓶颈&#xff1a;批处理请求中的内存碎片化** 快速开始安装vllm开始使用离线推理启动 vLLM 服务器 支持的模型文本语言模型生…...

“AI+城市治理”智能化解决方案

目录 一、建设背景 二、需求分析 三、系统设计 四、系统功能 五、应用场景 六、方案优势 七、客户价值 八、典型案例 一、建设背景 当前我国城市化率已突破65%,传统治理模式面临前所未有的挑战。一方面,城市规模扩大带来治理复杂度呈指数级增长,全国城市管理案件年…...

《医疗AI的透明革命:破解黑箱困境与算法偏见的治理之路》

医疗AI透明度困境 黑箱问题对医生和患者信任的影响&#xff1a;在医疗领域&#xff0c;AI模型往往表现为难以理解的“黑箱”&#xff0c;这会直接影响医生和患者对其诊断建议的信任度 。医生如果无法理解AI给出诊断的依据&#xff0c;就难以判断模型是否存在偏见或错误&#x…...

【论文阅读】Efficient and secure federated learning against backdoor attacks

Efficient and secure federated learning against backdoor attacks -- 高效且安全的可抵御后门攻击的联邦学习 论文来源问题背景TLDR系统及威胁模型实体威胁模型 方法展开服务器初始化本地更新本地压缩高斯噪声与自适应扰动聚合与解压缩总体算法 总结优点缺点 论文来源 名称…...

21、DeepSeekMath论文笔记(GRPO)

DeepSeekMath论文笔记 0、研究背景与目标1、GRPO结构GRPO结构PPO知识点**1. PPO的网络模型结构****2. GAE&#xff08;广义优势估计&#xff09;原理****1. 优势函数的定义**2.GAE&#xff08;广义优势估计&#xff09; 2、关键技术与方法3、核心实验结果4、结论与未来方向关键…...

深入解析:如何基于开源p-net快速开发Profinet从站服务

一、Profinet协议与软协议栈技术解析 1.1 工业通信的"高速公路" Profinet作为工业以太网协议三巨头之一,采用IEEE 802.3标准实现实时通信,具有: 实时分级:支持RT(实时)和IRT(等时实时)通信模式拓扑灵活:支持星型、树型、环型等多种网络结构对象模型:基于…...

腾讯多模态定制化视频生成框架:HunyuanCustom

HunyuanCustom 速读 一、引言 HunyuanCustom 是由腾讯团队提出的一款多模态定制化视频生成框架。该框架旨在解决现有视频生成方法在身份一致性(identity consistency)和输入模态有限性方面的不足。通过支持图像、音频、视频和文本等多种条件输入&#xff0c;HunyuanCustom 能…...

警惕C#版本差异多线程中的foreach陷阱

警惕C#版本差异多线程中的foreach陷阱​ 同样的代码,不同的结果闭包捕获的“时间差”问题绕过闭包陷阱的三种方法Lambda立即捕获(代码简洁)显式传递参数(兼容性最佳)使用Parallel.ForEach(官方推荐)注意事项:版本兼容性指南警惕多线程中的foreach陷阱:C#版本差异引发的…...

2024年AI发展趋势全面解析:从多模态到AGI的突破

2024年AI发展五大核心趋势 1. 多模态AI的爆发式增长 GPT-4V、Gemini等模型实现文本/图像/视频的跨模态理解应用场景扩展至智能客服、内容创作、工业质检等领域 2. 小型化与边缘AI的崛起 手机端LLM&#xff08;如Phi-2&#xff09;实现本地化部署隐私保护与实时响应的双重优…...

高精度之加减乘除之多解总结(加与减篇)

开篇总述&#xff1a;精度计算的教学比较杂乱&#xff0c;无系统的学习&#xff0c;且存在同法多线的方式进行同一种运算&#xff0c;所以我写此篇的目的只是为了直指本质&#xff0c;不走教科书方式&#xff0c;步骤冗杂。 一&#xff0c;加法 我在此讲两种方法&#xff1a; …...

Arduino 开源按键库大合集(单击/双击/长按实现)

2025.5.10 22:25更新&#xff1a;增加了Button2 2025.5.10 13:13更新&#xff1a;增加了superButton 虽然Arduino自带按键中断attachInterrupt(button1.PIN, isr, FALLING);&#xff0c;但是要是要实现去抖&#xff0c;双击检测&#xff0c;长按检测等等就略微麻烦些&#xff0…...

相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…...

Java零组件实现配置热更新

在某些场景下&#xff0c;我们需要实现配置的热更新&#xff0c;但是又要实现软件即插即用的需求&#xff0c;这就使我们不能引入过多复杂的插件&#xff0c;而nacos等配置中心在分布式业务场景下对配置的管理起着很重要作用&#xff0c;为此需要想一些办法去代替它们而完成同样…...

Kotlin高阶函数多态场景条件判断与子逻辑

Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…...

Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉

Ethercat转Profinet网关如何用"协议翻译术"打通自动化产线任督二脉 将遗留的Profinet设备&#xff08;如传感器&#xff09;接入现代EtherCAT主站&#xff08;如Codesys控制器&#xff09;避免全面更换硬件。 作为一名电气工程师&#xff0c;我最近面临的一个挑战&a…...

每日算法刷题Day1 5.9:leetcode数组3道题,用时1h

1.LC寻找数组的中心索引(简单) 数组和字符串 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 思想: 计算总和和左侧和&#xff0c;要让左侧和等于右侧和&#xff0c;即左侧和总和-左侧和-当前数字 代码 c代码: class Solution { public:i…...

MySQL的视图

一、MySQL视图的介绍和作用 MySQL视图&#xff0c;加油兄弟们&#xff0c;孰能生巧&#xff0c;完整代码在最后&#xff01;&#xff01;&#xff01; 视图是一个虚拟的表&#xff0c;并不是真是存在的&#xff0c;视图其实并没有真实的数据&#xff0c;他只是根据一个sql语句…...

旅游推荐数据分析可视化系统算法

旅游推荐数据分析可视化系统算法 本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法&#xff0c;包括推荐算法、数据分析算法和可视化算法。 目录 推荐算法 基于用户的协同过滤推荐基于浏览历史的推荐主题推荐算法 亲子游推荐算法文化游推荐算法自然风光推荐算法…...

Pandas:数据处理与分析

目录 一、Pandas 简介 二、Pandas 的安装与导入 三、Pandas 的核心数据结构 &#xff08;一&#xff09;Series &#xff08;二&#xff09;DataFrame 四、Pandas 数据读取与写入 &#xff08;一&#xff09;读取数据 &#xff08;二&#xff09;写入数据 五、数据清洗…...

非阻塞式IO-Java NIO

一、NIO简介 Java NIO是Java1.4引入的一种新的IO API&#xff0c;它提供了非阻塞式IO&#xff0c;选择器、通道、缓冲区等新的概念和机制。相比传统的IO&#xff0c;多出的N不单纯是新的&#xff0c;更表现在Non-blocking非阻塞&#xff0c;NIO具有更高的并发性、可扩展性以及…...

tryhackme——Enumerating Active Directory

文章目录 一、凭据注入1.1 RUNAS1.2 SYSVOL1.3 IP和主机名 二、通过Microsoft Management Console枚举AD三、通过命令行net命令枚举四、通过powershell枚举 一、凭据注入 1.1 RUNAS 当获得AD凭证<用户名>:<密码>但无法登录域内机器时&#xff0c;runas.exe可帮助…...

(二)Linux下基本指令 2

【知识预告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ‒r 指令 27. 重要的⼏个热键 28. 关机 16 date 指令 指定格式显⽰时间&#xff1a;date %Y-…...

[ctfshow web入门] web70

信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");读取的index.php error_reporting和ini_set被禁用了&#xff0c;不必管他 error_reporting(0); ini_set(display_errors, 0); // 你们在炫技吗&#xff1f; if(isset($_POST[c])){…...

第三章 Freertos智能小车遥控控制

本文基于小车APP&#xff0c;通过与蓝牙模块进行连接&#xff0c;发送特定信号给小车主控&#xff0c;实现对小车的模式切换、灯光控制、前进、后退、左右控制。目前还未加入电机控制&#xff0c;具体的电机控制效果还不能实现&#xff0c;但是可以进行模式切换与灯光控制。 …...

Spring 6.x 详解介绍

Spring 6.x 是 Spring Framework 的最新主版本&#xff0c;于2022年11月正式发布&#xff0c;标志着对 Java 17 和 Jakarta EE 9 的全面支持&#xff0c;同时引入了多项革新性特性&#xff0c;旨在优化性能、简化开发并拥抱现代技术趋势。 一、核心特性与架构调整 Java 17 与 J…...

阿里云OSS+CDN自动添加文章图片水印配置指南

文章目录 一、环境准备二、OSS水印样式配置三、CDN关键配置四、Handsome主题自动化配置五、水印效果验证六、常见问题排查 一、环境准备 资源清单 阿里云OSS Bucket&#xff08;绑定自定义域名 static.example.com&#xff09;阿里云CDN加速域名&#xff0c;回源为Bucket的域名…...