一道入门图搜索算法题

DFS:

c 复制代码
#include <stdio.h>

#define MAX 25          // 题目最大 20,留一点余量
int W, H;               // 列数、行数
char grid[MAX][MAX];    // 地图
int visited[MAX][MAX];  // 访问标记,0 未访问,1 已访问
int cnt;                // 能到达的黑色砖块总数

// 四个方向:上、下、左、右
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

// 深度优先搜索
void dfs(int x, int y) {
    int i;
    for (i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        // 边界检查
        if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
        // 只走黑色砖且未访问过
        if (grid[nx][ny] == '#' || visited[nx][ny]) continue;
        visited[nx][ny] = 1;
        cnt++;
        dfs(nx, ny);
    }
}

int main() {
    int i, j;
    int sx = 0, sy = 0;  // 起点坐标
    while (scanf("%d %d", &W, &H) == 2) {
        if (W == 0 && H == 0) break;  
        getchar();  // 吃掉行尾换行
        // 读地图
        for (i = 0; i < H; i++) {
            scanf("%s", grid[i]);
            for (j = 0; j < W; j++) {
                visited[i][j] = 0;
                if (grid[i][j] == '@') {
                    sx = i;
                    sy = j;
                }
            }
        }
        // 初始化
        cnt = 1;
        visited[sx][sy] = 1;
        // 从起点开始 DFS
        dfs(sx, sy);
        printf("%d\n", cnt);
    }
    return 0;
}

BFS:

c 复制代码
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

#define MAX 25

int W, H;
char g[MAX][MAX];
int vis[MAX][MAX];

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

struct Point {
    int x, y;
};

int bfs(int sx, int sy) {
    int cnt = 1;
    queue<Point> q;
    q.push({sx, sy});
    vis[sx][sy] = 1;

    while (!q.empty()) {
        Point cur = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = cur.x + dx[i];
            int ny = cur.y + dy[i];
            if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
            if (g[nx][ny] == '#' || vis[nx][ny]) continue;
            vis[nx][ny] = 1;
            cnt++;
            q.push({nx, ny});
        }
    }
    return cnt;
}

int main() {
    int sx, sy;
    while (cin >> W >> H && (W || H)) {
        for (int i = 0; i < H; i++) {
            cin >> g[i];
            for (int j = 0; j < W; j++)
                if (g[i][j] == '@') { 
                    sx = i; 
                    sy = j; 
                }
        }
        // 清空 vis
        memset(vis, 0, sizeof(vis));
        cout << bfs(sx, sy) << endl;
    }
    return 0;
}
相关推荐
-dzk-1 天前
【图论】LC 200.岛屿数量
深度优先·图论
木井巳2 天前
【记忆化搜索】斐波那契数
java·算法·leetcode·深度优先·剪枝·推荐算法
土司大王3 天前
LeetCode 79 单词搜索:Java 回溯模板、网格 DFS 与剪枝优化
java·算法·leetcode·深度优先
木井巳5 天前
【BFS/DFS 解决 FloodFill 算法】衣橱整理
java·算法·leetcode·深度优先·广度优先·宽度优先
Nil2086 天前
leetcode 22括号生成
算法·leetcode·深度优先
哪 吒6 天前
华为OD机试 - 云服务安全策略最优选择 - 深度优先搜索DFS(Java 新系统 200分)
java·华为od·深度优先
鹿角片ljp6 天前
LeetCode 22:括号生成|回溯dfs、剪枝与 char[] 覆盖代替撤销
算法·深度优先
hope_wisdom7 天前
C/C++数据结构之二叉树的遍历
c语言·数据结构·c++·二叉树·深度优先·广度优先
aqiu1111118 天前
【C++ 代码分析与重构】常见 DFS 逻辑错误解析与修正
c++·重构·深度优先
zander2588 天前
LeetCode 64. 最小路径和
算法·深度优先