这题其实可以很简单。

题目叫做“幻想迷宫”,那么我们就幻想一个迷宫。

借用一下@FancyDreams的图片

只有左上角第一个\(5*4\)的迷宫是真的,

其他都是我们幻想出来的。

并且,我们幻想自己在中间那个\(5*4\)的迷宫里的S处,我们并不需要开多很多倍的数组,要获取这个位置是'.'还是'#',只需对当前坐标取余\(n,m\)即可。注意一个细节,直接取余的话若\(x=n\),那么取余后就变成0了,所以我们要这样:

\[(x-1)\ mod\ n + 1
\]

y坐标同理。每走到一个点标记vis[取模后的坐标] = 当前迷宫的坐标,比如上图中,左上角的迷宫坐标是1,中上那个是2,最中间的是5,右下角的是9。

然后向4个方向拓展,如果这里不是'#',再判断,如果这个位置走过了并且不是在当前幻想的迷宫走的,那么恭喜,\(flag = 1; return;\)。否则继续搜。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#define rep(i,m,n) for(int i=m;i<=n;++i)
#define dop(i,m,n) for(int i=m;i>=n;--i)
using namespace std;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')w = -1;if(ch==-1) exit(0); ch = getchar();} //快读小细节,getchar()==-1时直接exit(0);
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
return s * w;
}
const int MAXN = 1600;
char a[MAXN][MAXN];
int n, m, sx, sy;
int vis[MAXN][MAXN], flag;
int l[] = { 233, -1, 1, 0, 0 }, r[] = { 666, 0, 0, -1, 1 };
inline char get(int x, int y){//获取当前的位置能不能走
return a[(x - 1) % n + 1][(y - 1) % m + 1];
}
void dfs(int x, int y){
if(flag) return; //找到了,直接返回
vis[(x - 1) % n + 1][(y - 1) % m + 1] = ((x / n - !(x % n)) * 3 + (y / m - !(y % m)) + 1); //标记这个位置是在当前幻想的迷宫走的
rep(i, 1, 4){ //向四个方向拓展
int X = x + l[i], Y = y + r[i];//X,Y为要到的位置
if(vis[(X - 1) % n + 1][(Y - 1) % m + 1] && vis[(X - 1) % n + 1][(Y - 1) % m + 1] != ((X / n - !(X % n)) * 3 + (Y / m - !(Y % m)) + 1)){ //如果走过了并且不是在当前迷宫走的,说明可以重复到达这个位置,也就是可以无限的走
flag = 1;
return ;
}
if(get(X, Y) != '#' && !vis[(X - 1) % n + 1][(Y - 1) % m + 1]) dfs(X, Y); //如果能走,dfs
}
}
int main(){
while(233){
n = read(); m = read();
rep(i, 1, n) rep(j, 1, m){
a[i][j] = getchar();
while(a[i][j] != '.' && a[i][j] != '#' && a[i][j] != 'S')
a[i][j] = getchar();
if(a[i][j] == 'S') sx = i, sy = j;
}
dfs(sx + n * 100, sy + m * 100);
memset(vis, 0, sizeof(vis));
if(flag){
printf("Yes\n");
flag = 0;
}
else printf("No\n");
}
return 0;
}

【洛谷 P1363】幻想迷宫(搜索)的更多相关文章

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

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

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

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

  3. 洛谷P1363 幻想迷宫

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

  4. 洛谷 P1363 幻想迷宫

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

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

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

  6. 络谷 P1363 幻想迷宫

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

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

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

  8. 【洛谷P1363】幻象迷宫

    P1363 幻想迷宫 显然,若从原图中起点走到相邻的图中对应的"起点"位置 ,就可以无限走下去, 若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去 我们不妨记录下 ...

  9. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  10. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

随机推荐

  1. 【数据库】 SQLite 介绍

    [数据库] SQLite 介绍 一. 特点 : 小而精悍 1. 轻量级 : 占用资源低 2. 嵌入式 : 无需安装,直接引用就可用 3. 支持 SQL 语法, 大部分兼容 Sql Server 语法, ...

  2. ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...

  3. Jquery append()总结(一) 转载

    转载自:http://dushanggaolou.iteye.com/blog/1173457 append(content)  /** * 向每个匹配的元素内部追加内容. * 这个操作与对指定的元素 ...

  4. SQLAlchemy 学习笔记(二):ORM

    照例先看层次图 一.声明映射关系 使用 ORM 时,我们首先需要定义要操作的表(通过 Table),然后再定义该表对应的 Python class,并声明两者之间的映射关系(通过 Mapper). 方 ...

  5. [转]juery-zTree的基本用法

    [简介] zTree 是利用 jQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实例 ...

  6. lintcode-93-平衡二叉树

    93-平衡二叉树 给定一个二叉树,确定它是高度平衡的.对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1. 您在真实的面试中是否遇到过这个题? Yes 样例 ...

  7. lintcode-76-最长上升子序列

    76-最长上升子序列 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列 ...

  8. 算法(4) Rotate Image

    题目:把一个N×N的矩阵旋转90° 思路:这个题目折腾了好长时间,确切地说是两个小时!这道题也反映出自己的逻辑比较混乱 这道题我到底卡在了哪里?自己已经在本子上画出了一个转移的关系 a[0][0] - ...

  9. 【Python】Python中子类怎样调用父类方法

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...

  10. Web.config配置文件中的属性add,key,value含义

    这是添加自定义字符串的方式,保存是以键-值的形式保存的,可以通过key获取value,一般用这种方法配置全局内使用的字符串. <configuration>是配置文件的根配置节. < ...