首页 > 其他分享 >洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S

洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S

时间:2024-03-08 16:36:19浏览次数:27  
标签:传输 int 洛谷题 Corn pos USACO11OPEN nx ny 坐标

原题链接:https://www.luogu.com.cn/problem/P1825

题意解读:计算最短路,依然是BFS。

解题思路:

相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题:

1、传输装置的存储

定义一个数组,vector<node> trans[30],数据的每个元素都是一个vector<node>,里面存两个节点,即一对坐标 2、传输装置的使用 当BFS过程中,如果走到一个字母(即传输装置起点),直接将坐标变换到对应的终点(在trans数组里查找即可) 3、标记已经过的坐标 当对走过的坐标打标记时,注意如果是传输装置,要打在起点上,表示下次不能再走,因为终点是传输过去的,下次如果上下左右经过,是可以再走的。

100分代码:

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

const int N = 305;

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

struct node
{
    int x, y;
};

char g[N][N]; //迷宫
bool flag[N][N]; //标记是否已走过
int depth[N][N]; //走过的步数
vector<node> trans[30]; //传送装置,一个字母对应两个坐标
queue<node> q; //队列,用于BFS
int sx, sy; //起点坐标
int n, m;

void bfs(int x, int y)
{
    flag[x][y] = true;
    q.push({x, y});

    while(q.size())
    {
        node t = q.front(); q.pop();

        for(int i = 0; i < 4; i++)
        {
            int nx = t.x + dx[i], ny = t.y + dy[i];
            if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
            if(flag[nx][ny] || g[nx][ny] == '#') continue;

            flag[nx][ny] = true; //注意标记必须在装置传输起点打上,传输终点没有主动走到过,可以再通过
            if(g[nx][ny] >= 'A' && g[nx][ny] <= 'Z') //位于传输装置起点或者终点则需要传输
            {
                vector<node> pos = trans[g[nx][ny] - 'A'];
                if(pos[0].x == nx && pos[0].y == ny)
                {
                    nx = pos[1].x;
                    ny = pos[1].y;
                }
                else
                {
                    nx = pos[0].x;
                    ny = pos[0].y;
                }
            }

            depth[nx][ny] = depth[t.x][t.y] + 1; //步数+1

            if(g[nx][ny] == '=') //到达终点
            {
                cout << depth[nx][ny];
                return;
            }
            q.push({nx, ny});
        }
    }
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin >> g[i][j];
            if(g[i][j] == '@') sx = i, sy = j;
            if(g[i][j] >= 'A' && g[i][j] <= 'Z') trans[g[i][j] - 'A'].push_back({i, j});
        }
    }
    bfs(sx, sy);

    return 0;
}

 

标签:传输,int,洛谷题,Corn,pos,USACO11OPEN,nx,ny,坐标
From: https://www.cnblogs.com/jcwy/p/18061273

相关文章

  • 洛谷题单指南-搜索-P1032 [NOIP2002 提高组] 字串变换
    原题链接:https://www.luogu.com.cn/problem/P1032题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。解题思路:思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数但是,有一些细节还需要注意:1、有多种替换......
  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......
  • 洛谷题单指南-搜索-P2404 自然数的拆分问题
    原题链接:https://www.luogu.com.cn/problem/P2404题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。解题思路:通过DFS,每次填一个数,填数时从1~n-1逐个填注意两个条件不能继续DFS:1、将填的数之和超过n2、将填的数小于上一次填......
  • 洛谷题单指南-搜索-P1101 单词方阵
    原题链接:https://www.luogu.com.cn/problem/P1101题意解读:对于方阵中的每一个字符,在8个方向上判断是否和"yizhong"匹配,是一个递归问题。解题思路:用chara[N][N]存储所有字符方阵,用boolb[N][N]标记每个字符是否在任一方向上和yizhong匹配遍历方阵每一字符,如果是'y'则在8个方......
  • 洛谷题单指南-搜索-P1019 [NOIP2000 提高组] 单词接龙
    原题链接:https://www.luogu.com.cn/problem/P1019题意解读:要计算接龙能得到的最长字符串,可以通过DFS暴搜所有可能的接龙方案解题思路:DFS的关键在于两个判断:1、下一个单词是否可以和上一个单词接龙,最短公共长度是多少(只需要看两个单词的最短公共长度,这样能保证接龙更长)2、单词......
  • 洛谷题单指南-搜索-P1605 迷宫
    原题链接:https://www.luogu.com.cn/problem/P1605题意解读:从起点走到终点的方案数,DFS可遍历所有情况。解题思路:在DFS过程中,有两种标记墙:不能访问已访问过的,不能重复访问定义数组inta[N][N]表示迷宫,1是墙或者已访问过的,0是可以通过的。100分代码:#include<bits/stdc++.h>......
  • 洛谷题单指南-搜索-P1433 吃奶酪
    原题链接:https://www.luogu.com.cn/problem/P1433题意解读:计算经过所有奶酪一次的总路径最短,可以采用dfs、dp等方法。解题思路:最直接的思路是DFS,暴搜所有的路径方案,计算最小距离,n最大是15,复杂度为15!≈10^12,必定会超时,先保证正确性,得到部分分:50分代码:#include<bits/stdc++.h......
  • 洛谷题单指南-搜索-P2895 [USACO08FEB] Meteor Shower S
    原题链接:https://www.luogu.com.cn/problem/P2895题意解读:所谓安全格子,就是在所有流星坠落之后,没有被烧焦的格子,要计算从起点到这些格子任一一个的最短路径,BFS可以解决。解题思路:1、读取数据,先把所有流星坠落点以及周围被烧焦的格子进行标记,得到安全格子2、从起点开始BFS,每走......
  • 洛谷题单指南-搜索-P1135 奇怪的电梯
    原题链接:https://www.luogu.com.cn/problem/P1135题意解读:计算A到B至少要按几次电梯,本质上就是求A到B的最短路径,可以通过BFS解决。解题思路:位于每一层,有两种选择:向上、向下BFS搜索直接从A找到B,每扩展一层,层数+1,层数即按电梯次数100分代码:#include<bits/stdc++.h>usingnam......
  • 洛谷题单指南-搜索-P1443 马的遍历
    原题链接:https://www.luogu.com.cn/problem/P1443题意解读:无论是国际象棋还是中国象棋,马的活动范围都是一样的:只不过国际象棋棋子是在格子中,中国象棋棋子是在交点,坐标的变化方式是一样的,根据此活动范围,计算马到达每一个点的最短路径。解题思路:根据马的活动范围,在棋盘内进行B......