defpre_search(u): # 前序遍历 if u == 0: return print(u, end=' ') pre_search(a[u][0]) pre_search(a[u][1])
defin_search(u): # 中序遍历 if u == 0: return in_search(a[u][0]) print(u, end=' ') in_search(a[u][1])
defpost_search(u): # 后序遍历 if u == 0: return post_search(a[u][0]) post_search(a[u][1]) print(u, end=' ')
defmain(): n = int(input()) for i inrange(1, n + 1): a[i][0], a[i][1] = map(int, input().split()) pre_search(1) print() in_search(1) print() post_search(1)
N = 25 n = 0 line = [0] * N ans = [0] * N tot = 0 le = {} ri = {}
defdfs(x): global tot if x == n + 1: tot += 1 if tot <= 3: print(" ".join(map(str, ans[1:n+1]))) return for i inrange(1, n + 1): # 枚举 y 坐标 if line[i] == 1or le.get(x - i, 0) or ri.get(x + i, 0): # 列或对角线被占用 continue line[i] = le[x - i] = ri[x + i] = 1# 标记占用 ans[x] = i # 第 x 行放置在第 i 列 dfs(x + 1) # 递归搜索下一行 line[i] = le[x - i] = ri[x + i] = 0# 回溯撤销标记
defmain(): global n n = int(input()) dfs(1) print(tot)
voiddfs(int u, int k) { if (u == ed) { flg = 1; // 联通标记 return; } for (int i = 1; i <= n; i++) { // 枚举下一个去的点 if (g[u][i] && i != k && !vis[i]) { vis[i] = 1; // 点 i 已经到达过 dfs(i, k); vis[i] = 0; // 回溯 if (flg) // 已经找到了联通方案 return; } } }
intmain() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); g[x][y] = g[y][x] = 1; // x 和 y 双向可达 } scanf("%d%d", &st, &ed); vis[st] = 1; dfs(st, 0); // 判断两点本来是否联通 if (!flg) { printf("-1"); return0; } for (int i = 1; i <= n; i++) // 枚举断点 if (i != st && i != ed) { flg = 0; dfs(st, i); if (!flg) // i 为断点时起点与终点不连通 ans += 1; } printf("%d", ans); return0; }
N = 1005 n = m = st = ed = ans = 0 g = [[0] * N for _ inrange(N)] vis = [0] * N flg = 0
defdfs(u, k): global flg, n, ed, g, vis if u == ed: flg = 1# 联通标记 return for i inrange(1, n + 1): # 枚举下一个去的点 if g[u][i] and i != k andnot vis[i]: vis[i] = 1# 点 i 已经到达过 dfs(i, k) vis[i] = 0# 回溯 if flg: # 已经找到了联通方案,提前返回 return
defmain(): global n, m, st, ed, ans, g, vis, flg # 第一行输入:站点数 n 和通道数 m n, m = map(int, input().split()) # 读取 m 行边信息 for _ inrange(m): u, v = map(int, input().split()) g[u][v] = g[v][u] = 1# x 和 y 双向可达
# 最后一行:查询的两个站点 st 和 ed st, ed = map(int, input().split()) # 判断起点和终点是否原本联通 vis[st] = 1 dfs(st, 0) # k = 0 表示不移除任何点 ifnot flg: print(-1) return ans = 0 # 枚举断点:除了 st 和 ed 之外的每个站点 for i inrange(1, n + 1): if i == st or i == ed: continue flg = 0 vis = [0] * (n + 1) vis[st] = 1 dfs(st, i) ifnot flg: # 如果移除 i 后起点与终点不连通,则 i 为断点 ans += 1 print(ans)
defbfs(n, m, X, Y): # 初始化结果矩阵,索引从1开始,因此额外开辟一行和一列 ans = [[-1] * (m + 1) for _ inrange(n + 1)] q = deque() q.append((X, Y)) ans[X][Y] = 0 while q: x, y = q.popleft() for i inrange(8): nx = x + dx[i] ny = y + dy[i] if nx < 1or nx > n or ny < 1or ny > m or ans[nx][ny] != -1: continue ans[nx][ny] = ans[x][y] + 1 q.append((nx, ny)) return ans
defmain(): n, m, X, Y = map(int, input().split()) ans = bfs(n, m, X, Y) for i inrange(1, n + 1): for j inrange(1, m + 1): print(ans[i][j], end=' ') print()
int n, vis[N][N], ans, dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1}; char a[N][N];
voiddfs(int x, int y) { vis[x][y] = 1; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 1 || nx > n || ny < 1 || ny > n || vis[nx][ny] || a[nx][ny] == '.') continue; dfs(nx, ny); } }
intmain() { scanf("%d", &n); // 读入之前先把边界初始化为海洋,确保 a[0][*]、a[n+1][*]、a[*][0] 和 a[*][n+1] 均为 '.' for (int i = 0; i <= n+1; i++) { a[i][0] = '.'; a[i][n+1] = '.'; } for (int j = 0; j <= n+1; j++) { a[0][j] = '.'; a[n+1][j] = '.'; } for (int i = 1; i <= n; i++) scanf("%s", a[i] + 1); // 第一次 DFS:统计所有岛屿数 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (!vis[i][j] && a[i][j] == '#') { dfs(i, j); ans++; } // 模拟海水淹没:将原本与海洋相邻的陆地标记为 ',' for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (a[i][j] == '#') { int flg = 0; for (int k = 0; k < 4; k++) { if (a[i + dx[k]][j + dy[k]] == '.') flg = 1; } if (flg) a[i][j] = ','; } } } memset(vis, 0, sizeof(vis)); // 第二次 DFS:统计仍然存在陆地(未被淹没)的岛屿,并从总数中扣除 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { if (a[i][j] == '#' && !vis[i][j]) { dfs(i, j); ans -= 1; } } printf("%d", ans); return0; }
defdfs(x, y): global n, vis, a, dx, dy vis[x][y] = 1 for i inrange(4): nx = x + dx[i] ny = y + dy[i] if nx < 1or nx > n or ny < 1or ny > n or vis[nx][ny] or a[nx][ny] == '.': continue dfs(nx, ny)
defmain(): global n, vis, a, ans, dx, dy input_data = sys.stdin.read().splitlines() ifnot input_data: return n = int(input_data[0]) # 初始化二维数组 a,大小为 (n+2)×(n+2),边界全设为海洋 '.' a = [['.'] * (n + 2) for _ inrange(n + 2)] for i inrange(1, n + 1): line = input_data[i].strip() for j inrange(1, n + 1): a[i][j] = line[j - 1] vis = [[0] * (n + 2) for _ inrange(n + 2)] ans = 0
# 第一次 DFS:统计所有岛屿数 for i inrange(1, n + 1): for j inrange(1, n + 1): ifnot vis[i][j] and a[i][j] == '#': dfs(i, j) ans += 1
# 模拟海水淹没:将原本与海洋相邻的陆地标记为 ',' for i inrange(1, n + 1): for j inrange(1, n + 1): if a[i][j] == '#': flg = 0 for k inrange(4): if a[i + dx[k]][j + dy[k]] == '.': flg = 1 if flg: a[i][j] = ','
# 重置访问数组 vis = [[0] * (n + 2) for _ inrange(n + 2)] # 第二次 DFS:统计未被淹没的岛屿,并从总数中扣除 for i inrange(1, n + 1): for j inrange(1, n + 1): if a[i][j] == '#'andnot vis[i][j]: dfs(i, j) ans -= 1
print(ans)
if __name__ == "__main__": dx = [1, -1, 0, 0] dy = [0, 0, 1, -1] n = 0 vis = [] a = [] ans = 0 main()
n = 5 # 构造一个 (n+1) x (n+1) 的二维数组,模仿 C++ 中 1 索引的数组 a = [[0] * (n + 1) for _ inrange(n + 1)] ans = 0
defcheck(): global a tot_1 = 0 # 检查每一行 for i inrange(1, n + 1): row_sum = 0 for j inrange(1, n + 1): row_sum += a[i][j] tot_1 += a[i][j] if row_sum == 5or row_sum == 0: return0
# 检查白子数量:白子先下,故必定有 13 个 if tot_1 != 13: return0
# 检查每一列 for i inrange(1, n + 1): col_sum = 0 for j inrange(1, n + 1): col_sum += a[j][i] if col_sum == 5or col_sum == 0: return0
# 检查第一条对角线(主对角线) diag_sum = 0 for i inrange(1, n + 1): diag_sum += a[i][i] if diag_sum == 5or diag_sum == 0: return0
# 检查另一条对角线(反对角线) anti_diag_sum = 0 for i inrange(1, n + 1): anti_diag_sum += a[i][n + 1 - i] if anti_diag_sum == 5or anti_diag_sum == 0: return0
return1
defdfs(x, y): global ans, a # 当遍历到第6行时,说明所有行均已处理 if x == n + 1: ans += check() return # 计算下一个位置的坐标: if y == n: next_x = x + 1 next_y = 1 else: next_x = x next_y = y + 1 # 尝试将当前位置设为 0 a[x][y] = 0 dfs(next_x, next_y) # 尝试将当前位置设为 1 a[x][y] = 1 dfs(next_x, next_y)
# 全局变量 n = 0 m = 0 a = [] # 1-indexed 数组,a[0]为哑元 ans = 10**9# 初始值取一个较大数 mp = {} # 用字典模拟 unordered_map
defdfs1(x, kni, cur_sum): global ans, mp, n, m, a if cur_sum > m or kni >= ans: return if cur_sum == m: ans = min(ans, kni) return if x == (n // 2) + 1: if cur_sum in mp: mp[cur_sum] = min(mp[cur_sum], kni) else: mp[cur_sum] = kni return dfs1(x + 1, kni + 1, cur_sum + a[x]) dfs1(x + 1, kni, cur_sum) dfs1(x + 1, kni, cur_sum + a[x] * 2)
defdfs2(x, kni, cur_sum): global ans, mp, n, m, a if cur_sum > m or kni >= ans: return if cur_sum == m: ans = min(ans, kni) return if x == n + 1: if (m - cur_sum) in mp: ans = min(ans, mp[m - cur_sum] + kni) return dfs2(x + 1, kni + 1, cur_sum + a[x]) dfs2(x + 1, kni, cur_sum) dfs2(x + 1, kni, cur_sum + a[x] * 2)
defmain(): global n, m, a, ans, mp data = sys.stdin.read().split() ifnot data: return n = int(data[0]) m = int(data[1]) m *= 2 a = [0] * (n + 1) for i inrange(1, n + 1): a[i] = int(data[i + 1]) # 对 a[1...n] 进行排序 a[1:] = sorted(a[1:]) dfs1(1, 0, 0) dfs2((n // 2) + 1, 0, 0) if ans == 10**9: print(-1) else: print(ans)