constint MAXN = 1005; int n, m; int graph[MAXN][MAXN]; // 邻接矩阵 bool visited[MAXN]; int dist[MAXN]; // 距离数组
// BFS 基础模板 voidbfs(int start){ queue<int> q; q.push(start); visited[start] = true; dist[start] = 0; while (!q.empty()) { int u = q.front(); q.pop(); // 遍历所有邻接节点 for (int v = 1; v <= n; v++) { if (graph[u][v] && !visited[v]) { visited[v] = true; dist[v] = dist[u] + 1; q.push(v); } } } }
intmain(){ memset(visited, false, sizeof(visited)); memset(dist, -1, sizeof(dist)); // 输入图的信息 cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; graph[u][v] = graph[v][u] = 1; // 无向图 } bfs(1); // 从节点1开始搜索 return0; }
constint MAXN = 1005; int n, m; char maze[MAXN][MAXN]; int dist[MAXN][MAXN]; int sx, sy, ex, ey; // 起点和终点坐标
int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1};
structPoint { int x, y; };
intbfs(){ queue<Point> q; q.push({sx, sy}); memset(dist, -1, sizeof(dist)); dist[sx][sy] = 0; while (!q.empty()) { Point cur = q.front(); q.pop(); // 到达终点 if (cur.x == ex && cur.y == ey) { return dist[ex][ey]; } for (int i = 0; i < 4; i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != '#' && dist[nx][ny] == -1) { dist[nx][ny] = dist[cur.x][cur.y] + 1; q.push({nx, ny}); } } } return-1; // 无法到达终点 }
intmain(){ cin >> n >> m; for (int i = 0; i < n; i++) { cin >> maze[i]; for (int j = 0; j < m; j++) { if (maze[i][j] == 'S') { sx = i; sy = j; } if (maze[i][j] == 'E') { ex = i; ey = j; } } } int result = bfs(); if (result == -1) { cout << "无法到达终点" << endl; } else { cout << result << endl; } return0; }
constint MAXN = 1005; int n, m; vector<int> graph[MAXN]; // 邻接表 bool visited[MAXN];
voiddfs(int u){ visited[u] = true; cout << u << " "; // 访问节点 // 遍历所有邻接节点 for (int v : graph[u]) { if (!visited[v]) { dfs(v); } } }
intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; graph[u].push_back(v); graph[v].push_back(u); // 无向图 } memset(visited, false, sizeof(visited)); dfs(1); // 从节点1开始 return0; }
constint MAXN = 1005; int n, m; char grid[MAXN][MAXN]; bool visited[MAXN][MAXN];
int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1};
voiddfs(int x, int y){ visited[x][y] = true; // 遍历四个方向 for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && grid[nx][ny] != '#') { dfs(nx, ny); } } }
intmain(){ cin >> n >> m; for (int i = 0; i < n; i++) { cin >> grid[i]; } memset(visited, false, sizeof(visited)); dfs(0, 0); return0; }
constint MAXN = 1005; int n, m; char grid[MAXN][MAXN]; bool visited[MAXN][MAXN];
int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1};
voiddfs(int x, int y){ visited[x][y] = true; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && grid[nx][ny] == '1') { dfs(nx, ny); } } }
intcountIslands(){ int count = 0; memset(visited, false, sizeof(visited)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (grid[i][j] == '1' && !visited[i][j]) { dfs(i, j); count++; } } } return count; }
intmain(){ cin >> n >> m; for (int i = 0; i < n; i++) { cin >> grid[i]; } cout << countIslands() << endl; return0; }
2️⃣ 剪枝优化
剪枝的本质: 提前判断当前搜索分支不可能得到最优解或合法解,直接舍弃该分支。
常见剪枝策略
2.1 可行性剪枝
如果当前状态已经不合法,直接返回。
1 2 3 4 5 6 7 8
voiddfs(int x, int y, int sum){ // 可行性剪枝:超出范围 if (x < 0 || x >= n || y < 0 || y >= m) return; // 可行性剪枝:遇到障碍物 if (grid[x][y] == '#') return; // 继续搜索... }
2.2 最优性剪枝
如果当前解已经不可能比已知的最优解更好,直接返回。
1 2 3 4 5 6 7 8 9 10 11 12 13
int bestAns = INF;
voiddfs(int depth, int currentCost){ // 最优性剪枝 if (currentCost >= bestAns) return; if (depth == n) { bestAns = min(bestAns, currentCost); return; } // 继续搜索... }
intmain(){ cin >> n; for (int i = 0; i < n; i++) { cin >> arr[i]; } memset(dp, -1, sizeof(dp)); int ans = 0; for (int i = 0; i < n; i++) { ans = max(ans, dfs(i)); } cout << ans << endl; return0; }
constint MAXN = 1005; int n, m; char grid[MAXN][MAXN]; int g[MAXN][MAXN]; // 实际代价 bool visited[MAXN][MAXN];
int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1};
structNode { int x, y; int g; // 实际代价 int h; // 启发代价 int f; // 总代价 booloperator<(const Node& other) const { return f > other.f; // 优先队列小根堆 } };
// 曼哈顿距离启发函数 intheuristic(int x1, int y1, int x2, int y2){ returnabs(x1 - x2) + abs(y1 - y2); }
intastar(int sx, int sy, int ex, int ey){ priority_queue<Node> pq; memset(g, 0x3f, sizeof(g)); memset(visited, false, sizeof(visited)); g[sx][sy] = 0; pq.push({sx, sy, 0, heuristic(sx, sy, ex, ey), heuristic(sx, sy, ex, ey)}); while (!pq.empty()) { Node cur = pq.top(); pq.pop(); int x = cur.x, y = cur.y; if (visited[x][y]) continue; visited[x][y] = true; // 到达终点 if (x == ex && y == ey) { return g[x][y]; } // 扩展邻居 for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] != '#' && !visited[nx][ny]) { int newG = g[x][y] + 1; if (newG < g[nx][ny]) { g[nx][ny] = newG; int h = heuristic(nx, ny, ex, ey); pq.push({nx, ny, newG, h, newG + h}); } } } } return-1; // 无法到达 }
intmain(){ int sx, sy, ex, ey; cin >> n >> m; for (int i = 0; i < n; i++) { cin >> grid[i]; } cin >> sx >> sy >> ex >> ey; int result = astar(sx, sy, ex, ey); cout << result << endl; return0; }