首页 > 其他分享 >洛谷题单指南-图的基本应用-P1363 幻象迷宫

洛谷题单指南-图的基本应用-P1363 幻象迷宫

时间:2024-04-03 11:35:33浏览次数:169  
标签:P1363 int 洛谷题 rx ry vis 幻象 坐标 rrx

原题链接:

题意解读:迷宫可以无限扩展,对第一个样例进行模拟,扩展4块的示意图:

从起点S,沿着红色虚线,是可以无限走下去的,要判断是否能够无限走下去。

解题思路:

直观上,会考虑把迷宫复制多块,但是会面临2个问题:

1、内存可能爆掉

2、如何有效判断可以无限走下去?只考虑竖向或者横向连通是不够的,比如以下case:

横向上并没有连通,借道扩展出来的迷宫才可抵达。

所以,不必把迷宫复制多块,直接计算坐标x = rx % n, y = ry % m来DFS,同时保留真实坐标rx,ry,同样面临两个问题:

1、如何标记一个点是否走过,以及如何保存走过时的真实x、y坐标

可以用二维数组bool vis[N][M],vis[x][y] = true表示一个点已经走过,x、y是对n、m取模之后的坐标

用另外两个二维数组int rrx[N][M], ry[N][M],rrx[x][y] = rx记录x、y对应的真实x坐标,rry[x][y] = ry记录x、y对应的真实y坐标

判断一个点能不能再走的条件:!vis[x][y] || rrx[x][y] != rx || rry[x][y] != ry

也就是只要一个点未标记过,或者真实x坐标不同、或者真实y坐标不同,任意一个成立则说明该点可以走。

2、如何判断可以无限走下去

可以断定,如果一个坐标点,如果两次都走到过(取模后的坐标一致),并且真实坐标不相同,则一定可以无限走下去。

两次都走到过的判断:vis[x][y] && rrx[x][y] == rx && rry[x][y] == ry

100分代码:

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

const int N = 1505, M = 1505;

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

char a[N][M];
int n, m, x, y;
bool vis[N][M];
int rrx[N][M], rry[N][M];

//x,y是对n,m取模后的坐标,rx,ry是真实坐标
bool dfs(int x, int y, int rx, int ry)
{
    //如果两次走到同一个位置的点,且真实坐标不同,则说明可以无限走下去
    if(vis[x][y] && (rx != rrx[x][y] || ry != rry[x][y]))
    {
        return true;
    }
    //做标记,并记录真实坐标
    vis[x][y] = true; rrx[x][y] = rx; rry[x][y] = ry;

    for(int i = 0; i < 4; i++)
    {
        int nx = (x + dx[i] + n) % n; //+n防止为负
        int ny = (y + dy[i] + m) % m; //+m防止为负
        int nrx = rx + dx[i];
        int nry = ry + dy[i];
        if(a[nx][ny] == '#') continue;
        if(vis[nx][ny] && nrx == rrx[nx][ny] && nry == rry[nx][ny]) continue;
        if(dfs(nx, ny, nrx, nry)) return true;
    }
    return false;
}

int main()
{
    while(cin >> n >> m)
    {
        for(int i = 0; i < n; i++) //由于走到迷宫边界后,再往外走坐标要取模,从0开始更便于处理,比如n=5,x=4,(x+1)%5=0
        {
            for(int j = 0; j < m; j++)
            {
                cin >> a[i][j];
                if(a[i][j] == 'S') 
                {
                    x = i;
                    y = j;
                }
            }
        }
        memset(vis, 0, sizeof(vis));
        memset(rrx, 0, sizeof(rrx));
        memset(rry, 0, sizeof(rry));
        if(dfs(x, y, x, y)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

 

标签:P1363,int,洛谷题,rx,ry,vis,幻象,坐标,rrx
From: https://www.cnblogs.com/jcwy/p/18112288

相关文章

  • 洛谷题单指南-图的基本应用-P2853 [USACO06DEC] Cow Picnic S
    原题链接:https://www.luogu.com.cn/problem/P2853题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。解题思路:直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。100分代码:#include<bi......
  • 洛谷题单指南-图的基本应用-P1127 词链
    原题链接:https://www.luogu.com.cn/problem/P1127题意解读:按字典序排列单词,使得相邻单词的首位字母一样。解题思路:由于单词之间可以相邻的条件是前一个单词的末尾字母和后一个单词的开头字母一样,因此可以遍历每一个单词,再找到每一个可以接在其后面的单词,建立一个邻接表,然后从......
  • 洛谷题单指南-图的基本应用-P1807 最长路
    原题链接:https://www.luogu.com.cn/problem/P1807题意解读:由于对于每一条边u->v,都有u<v,因此节点1的入度一定是0,且是有向无环图,直观上可以通过拓扑排序法搜索每一个节点,计算1到每一个节点的最长距离。但问题在于,入度为0的节点可能不止一个,这样在计算到某个点的最长距离时,会受到......
  • 洛谷题单指南-图的基本应用-P4017 最大食物链计数
    原题链接:https://www.luogu.com.cn/problem/P4017题意解读:食物链的顶端不会被其他生物吃,在图结构中设定为入度是0,食物链的底端不会吃其他生物,在图结构式设定为出度是0,此题就是要计算所有入度是0的点到所有出度是0的点一共有多条路径。解题思路:首先,来模拟一样样例,样例数据形成的......
  • 洛谷题单指南-图的基本应用-P3916 图的遍历
    原题链接:https://www.luogu.com.cn/problem/P3916题意解读:寻找每个点所能到达的最大的点。解题思路:直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到......
  • 洛谷题单指南-图的基本应用-P5318 【深基18.例3】查找文献
    原题链接:https://www.luogu.com.cn/problem/P5318题意解读:图的建立、DFS、BFS模版题。解题思路:本题主要考察建图、图的DFS、BFS遍历。建图方式:领接表vector<int>g[N];需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编号排序,满足题目要求的“如果有很多篇文章可以参阅,请......
  • 洛谷题单指南-集合-P2814 家谱
    原题链接:https://www.luogu.com.cn/problem/P2814题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。解题思路:由于存在真正的父子关系,所以在并查集合并的时候,要把p[x]=y中x设置为子,y设置为父,其余都是并查集的常规操作。由于是计算姓名之间的父子关系,并查集可以用map......
  • 洛谷题单指南-集合-P3879 [TJOI2010] 阅读理解
    原题链接:https://www.luogu.com.cn/problem/P3879题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。解题思路:要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,可以使用如下数据结构:map<string,set<int>>h;只......
  • 洛谷题单指南-集合-P1955 [NOI2015] 程序自动分析
    原题链接:https://www.luogu.com.cn/problem/P1955题意解读:要判断约数条件是否可以同时满足,主要是要判断不相等的情况。解题思路:对于相等的条件,直接进行集合合并即可;对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。由于i,j的范围至10^9,定义并查集如果......
  • 洛谷题单指南-集合-P1892 [BOI2003] 团伙
    原题链接:https://www.luogu.com.cn/problem/P1892题意解读:此题与关押罪犯问题非常像,本质上就是要合并所有的朋友。解题思路:首先,初始化并查集;对于每一对人的关系,如果是朋友,直接进行合并;如果是敌人,先查看双方之前是否有记录其他敌人,如果有,则将一方与另一方的敌人进行合并,如果没......