题解:#1950.「洛谷 P1746」离开中山路 审核通过

lyhmbr CSP-J2二等 2024-07-17 10:41:10 2024-07-19 16:58:26 8

中心

这是一道经典的 题,即广搜,广搜的结构下面说

题意

1.给你一串字符串,存到变量数组中

2. 表示可以走 , 表示走不了

3.给你起点和终点,最后输出需要多少步

思路

因为懒因为处理字符串比较麻烦于是在输入过程中将其转化为二维数组

定义结构体 存储节点信息

代码如下:

struct node {
    int x, y;
    int step;
};

分别是其所在的位置

是当前所用步数

----分割线----

接着接着就是套用 模板了

对于第一次接触的来说 如下:

void bfs() {
    queue<node> que;
    que.push("起点");

    while (!que.empty()) {
        node f = que.front();
        que.pop();

        if ("f 位于终点 即搜索完毕") {
            cout << "题目要求的某个值";
            return;
        }

        "记忆化处理变量名随意"

            for ("接着往下搜看看有没有可以遍历到的") {
            if ("该节点符合条件") {
                que.push("该节点");
            }
        }
    }
    // 代码是现写的,希望没错,可以看下面的题解代码理解
}

代码

希望能理解模板

#include <bits/stdc++.h>
#include <queue>
using namespace std;

struct node {
    int x, y;
    int step;
};

node tend, tstart;
int tmap[1007][1007];
int used[1007][1007];

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

int n;

void bfs() {
    queue<node> que;
    que.push(tstart);
    // 将起点插入队首
    while (!que.empty()) {
        node f = que.front();
        que.pop();
        // 获取队首的变量

        if (f.x == tend.x && f.y == tend.y) {
            cout << f.step;
            return;
        }
        // 终点判断,下面是开始搜索
        for (int i = 0; i < 4; i++) {
            int x = f.x + dx[i];
            int y = f.y + dy[i];
            if (x >= 1 && x <= n && y >= 1 && y <= n && tmap[x][y] == 0 &&
                used[x][y] == 0) {
                /* tmap[x][y] = 1; */
                used[x][y] = 1;
                node tmp;
                tmp.x = x;
                tmp.y = y;
                tmp.step = f.step + 1;
                que.push(tmp);
                // 将可以的路径做处理并入队
            }
        }
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            char t;
            cin >> t;
            tmap[i][j] = t - '0';
            // 输入预处理
            // char 转 int
        }
    }
    // 取消下面注释可以看到预处理后的数组
    /* for (int i = 1; i <= n; i++) { */
    /*     for (int j = 1; j <= n; j++) { */
    /*         cout << tmap[i][j] << " "; */
    /*     } */
    /*     cout <《 endl; */
    /* } */
    int sx,sy,ex,ey;
    cin >> tstart.x >> tstart.y >> tend.x >> tend.y;
    tstart.step = 0;
    // 处理起点和终点
    bfs()}
{{ vote && vote.total.up }}

共 1 条回复

CPP 刷题王

排版可以稍稍优化一下