[LuoguP1363]幻想迷宫(Link

现在有一个迷宫,从迷宫边界的任意一点可以走到对面,即:若都是路面,则可以从\((1, i)\)走到\((N, i)\)。其余情况依旧。问是否可以从指定的起点\((Sx, Sy)\)走到无限远的距离。

简化题目中说了什么叫做走到无限远的距离。那么第一种思路就是计算如果某一个边界点可以到达与之相对应的边界点,那么我们就说可以走到无限远的距离。但是仔细思考之后我们发现这个显然不行,因为它没有考虑在路途中可以进行边界传送。列如下面的样例:

我们从起点开始向右走一个距离,然后接着往上也是可以走的,但是上述的方法就不会考虑。因此这么搜显然是不对的。那么我们考虑建立一个新的图:将原图扩大\(8\)块。也就是变成了:

那么我们就知道怎么搞了。按照原来的思路我们从起点开始深搜,然后碰到一个点,他不是原图中的点,但是还原到原图的位置时,我们发现它已经走过了,那么就说明可以走到无限远。但是如果我们是要一直往上走3次,4次呢?那么直接存图显然就是不可取的,既然是有可能无限,那么想到唯一不会爆内存并且可行的方法就是取模。

我们在搜索的时候记录\(4\)个变量分别为\(X, Y, TrueX, TrueY\)。后两个表示真实坐标,前两个表示还原到原图中的坐标位置,也就是取模后的。

当我们走到一个点的时候如果我们发现\(Visit[X][Y] == 1\)并且\(X != TrueX|| Y != TrueY\),那么说明这个点被走了第二遍。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef long long LL ;
const int MAXN = 1510 ;
const int MAXM = 1510 ;
const int Inf = 0x7fffffff ;
int N, M, Map[MAXN][MAXM], Sx, Sy ;
struct VISIT{
    int V, X, Y ;
}F[MAXN][MAXM] ;
bool Gone ;
int Dx[5] = {0, 1, -1, 0, 0} ;
int Dy[5] = {0, 0, 0, 1, -1} ;

inline int Read() {
    int X = 0, F = 1 ; char ch = getchar() ;
    while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
    while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
    return X * F ;
}

inline void Dfs(int X, int Y, int TrueX, int TrueY) {
    if (Gone) return ;
    if (F[X][Y].V && ((F[X][Y].X != TrueX) || (F[X][Y].Y != TrueY))) {
        Gone = 1 ; return ;
    }
    F[X][Y].V = 1 ; F[X][Y].X = TrueX ; F[X][Y].Y = TrueY ;
    for (int i = 1 ;  i <= 4 ; i ++) {
        int NextX = (X + Dx[i] + N - 1) % N + 1;
        int NextY = (Y + Dy[i] + M - 1) % M + 1;
        int NextXX = TrueX + Dx[i] ;
        int NextYY = TrueY + Dy[i] ;
        if (Map[NextX][NextY]) {
            if (! F[NextX][NextY].V || F[NextX][NextY].X != NextXX || F[NextX][NextY].Y != NextYY)
                Dfs(NextX, NextY, NextXX, NextYY) ;
        }
    }
}

int main() {
    while (cin >> N >> M) {
        memset(Map, 0, sizeof(Map)) ;
        memset(F, 0, sizeof(F)) ;
        Gone = 0 ;
        for (int i = 1 ; i <= N ; i ++)
        for (int j = 1 ; j <= M ; j ++) {
            char ch ; cin >> ch ;
            if (ch == '#') continue ;
            else Map[i][j] =  1 ;
            if (ch == 'S') Sx = i, Sy = j ;
        }
        Dfs(Sx, Sy, Sx, Sy) ;
        puts(Gone ? "Yes" : "No") ;
    }
}

[LuoguP1363]幻想迷宫的更多相关文章

  1. 【洛谷】【搜索(dfs)】P1363 幻想迷宫

    [题目描述:] 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一 ...

  2. 洛谷 P1363 幻想迷宫 解题报告

    P1363 幻想迷宫 题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊-- LHX:mo ...

  3. 【洛谷 P1363】幻想迷宫(搜索)

    这题其实可以很简单. 题目叫做"幻想迷宫",那么我们就幻想一个迷宫. 借用一下@FancyDreams的图片 只有左上角第一个\(5*4\)的迷宫是真的, 其他都是我们幻想出来的. ...

  4. 络谷 P1363 幻想迷宫

    P1363 幻想迷宫 题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:mo ...

  5. 洛谷P1363 幻想迷宫

    题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:momo...我们一定能走 ...

  6. 洛谷 P1363 幻想迷宫

    题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:momo...我们一定能走 ...

  7. [P1363] 幻想迷宫

    题目链接 很好的一道搜索题,应该是利用了离散化的思想我好蒟蒻呀 地图是根据给定的图无限的拼接的. 所以说暴力建图是不可取的. 其实不难看出,在跨越两张图时.我们就可以看做这个点时空穿梭一般.从底下回来 ...

  8. 伪题解 洛谷 P1363 幻想迷宫(DFS)

    毒瘤题,做了一晚上抄题解A了 因为是抄题解,我也不好意思说什么了,就发篇博客纪念一下吧 #include<iostream> #include<cstring> #includ ...

  9. 洛谷P1363 幻想迷宫【dfs】

    题目:https://www.luogu.org/problemnew/show/P1363 题意: 有一个地图,起点是S,障碍物用#表示.可以将这个地图不断的在四周重复,问从起点开始是否可以走到无限 ...

随机推荐

  1. 内部类 ( Inner Class )

    内部类的作用: 1.隐藏内部实现,高内聚. 2.Java多继承的实现. 何为Java的多继承? Java只支持单一继承,所以如果需要多继承,那么可用内部类来实现. 如何实现? 1.父类A public ...

  2. Redis实现分布式锁2

    redisTemplate实现分布式锁 /** * 分布式锁-加锁 * @param key * @param value 当前时间+超时时间 System.currentTimeMillis()+t ...

  3. UOJ#414. 【APIO2018】新家

    传送门 首先二分答案 \(mid\),问题变成求区间 \([l-mid,r+mid]\) 在该年份的不同类型个数为 \(k\) 关于年份的限制可以离线下来 现在的问题就是区间数颜色,一个套路就是维护每 ...

  4. PHP开发支付宝之电脑网站支付--流程简介

    前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...

  5. Vuex2.0边学边记+两个小例子

    最近在研究Vuex2.0,搞了好几天终于有点头绪了. 首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各 ...

  6. 使用 js 实现文本过多时隐藏部分文本

    使用 js 实现文本过多时隐藏部分文本 情景描述: 有时候我们需要显示部分文字,就像 QQ 空间这样,先显示部分文字,加一个[查看全文],让用户选择是否查看全部 解决方法: 第一步:在一个 id 为 ...

  7. 中国国内 - 可用API合集

    中国国内 - 可用API合集 收录一篇中国国内可用API合集,分享给大家 目录 笔记 出行 词典 电商 地图 电影 即时通讯 开发者网站 快递查询 旅游 社交 视频 天气 团队协作 图片与图像处理 外 ...

  8. MyBatis学习笔记(一)

    测试Demo的目录结构: com.luohao.config ->MyBatisCongfig.xml ->userMapper.xml com.luohao.Test ->Test ...

  9. LeetCode33 搜索旋转排序数组

    搜索旋转排序数组 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标 ...

  10. Oracle 检查表的数据变动

    本知识点仅适用于Oracle 9i以上的版本. 查看表的数据变动情况请使用SQL语句:select * from user_tab_modifications; user_tab_modificati ...