无穷迷宫

jzoj 3924

题目大意

有一个n*m的迷宫,有墙(#),路(.),和你的位置(S),这个迷宫会复制无数份拼在一起,问你能不能不停地走下去

输入样例

2
5 4
##.#
##S#
#..#
#.##
#..#
5 4
##.#
##S#
#..#
..#.
#.##

输出样例

Yes
No

样例解释

第一组测试数据中,机器人不断沿着路径向上走即可。
第二组测试数据中,机器人无论向哪个方向走都会是死路。

数据范围

50% 的数据:1⩽N,M⩽50.1 \leqslant N, M \leqslant 50.1⩽N,M⩽50.
100% 的数据:1⩽N,M⩽1500,1⩽T⩽4.1 \leqslant N, M \leqslant 1500,1 \leqslant T \leqslant 4.1⩽N,M⩽1500,1⩽T⩽4.

解题思路

因为我们不能尝试不停的走下去,那我们想一下:
如果我们能做到不同迷宫的同一位置,那我们就可以用同样的方式再走到另一个迷宫的同一位置,那就是可以无限得走下去
那我们dfs时,保存在迷宫内的位置,也要保存对于第一个迷宫的位置,这样就可以判断是不是不同迷宫的统一个位置

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int t, n, m, x, y, ans, f[2000][2000][5];
char a[2000][2000];
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
int sx(int x)
{return (x + n - 1) % n + 1;
}
int sy(int y)
{return (y + m - 1) % m + 1;
}
void dfs(int x, int y, int lx, int ly)//xy是%了的lxly是没%的
{if (f[x][y][0] && (f[x][y][1] != lx || f[x][y][2] != ly))//之前是否在别的迷宫到过这个位置{ans = 1;return;}f[x][y][0] = 1;f[x][y][1] = lx;f[x][y][2] = ly;for (int i = 0; i < 4 && !ans; ++i)if (a[sx(x + dx[i])][sy(y + dy[i])] != '#' && (!f[sx(x + dx[i])][sy(y + dy[i])][0] || f[sx(x + dx[i])][sy(y + dy[i])][1] != lx + dx[i] || f[sx(x + dx[i])][sy(y + dy[i])][2] != ly + dy[i]))//不是同一个迷宫,或没到过且不是墙dfs(sx(x + dx[i]), sy(y + dy[i]), lx + dx[i], ly + dy[i]);
}
int main()
{scanf("%d", &t);while(t--){memset(f, 0, sizeof(f));ans = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j){cin>>a[i][j];if (a[i][j] == 'S')x = i, y = j;}dfs(x, y, x, y);if (ans) printf("Yes\n");else printf("No\n");}return 0;
}

【dfs】无穷迷宫(jzoj 3924)相关推荐

  1. [AcWing算法刷题]之DFS+BFS迷宫模板(简单)

    题目来源: 题库 - AcWing 目录 DFS和BFS模板题目:迷宫类 机器人的运动范围​ 字母 迷宫 红与黑 棋盘问题 马走日 全球变暖 DFS综合类 乘积最大(提高课) 单词接龙(提高课) 取石 ...

  2. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  3. DFS破解“迷宫问题”(洛谷P1605题题解,Java语言描述)

    迷宫 题目要求 P1605题目链接 分析 我的思路还比较容易理解,但确实开的数组太多了(最终代码). 我想开一个递归的DFS搜索,对越界情况进行淘汰 (话说这能算剪枝吗) ,再就是只允许在没被标记为已 ...

  4. DFS 简单迷宫及路径打印

    问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 问题分析 ...

  5. DFS走迷宫问题(非最短路径)

    上面之所以要强调非最短路径,是因为在下一篇我要用BFS来求解最短路径的问题.这里只是讲如何走出迷宫. #include<cstdio> #define M 10 #define N 10 ...

  6. 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述 /*请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...

  7. [概率][lca][dfs][树形dp] Jzoj P4225 宝藏

    Description Input Output Sample Input 231 01 221 0 12 0 2 140 12 03 013 0 1 0 1 Sample Output 1.0000 ...

  8. [并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks

    Description 有一个居住在多山岛屿的登山家,已经攀上了一座山峰,并且要攀爬另外一座更高的山峰. 更精确地说,岛上的每一点都有一个大于零的海拔(海面的海拔为零),并且如果登山家位于海拔Ei的山 ...

  9. K - 老鼠走迷宫(DFS)

    Description 现在一只老鼠被困在了迷宫里!你需要判断老鼠能否走出迷宫. 老鼠只能向上下左右四个方向移动.我们认为只要老鼠走到了迷宫的边界即算走出迷宫. Input 第一行输入两个整数 n, ...

最新文章

  1. CVPR 2021 Oral | Transformer再发力!华南理工和微信提出UP-DETR
  2. 计算机中丢失 MSVCR100.dll
  3. android 绘制5格电量,Android 如何把状态栏信号格改为5格
  4. linux和windows互传文件 、用户配置文件和密码配置文件 、用户与用户组管理
  5. SpringBoot2.1.9 多MongoDB配置
  6. html 监控键盘,后台监控鼠标和键盘(可监听全局的鼠标以及键盘按键)
  7. JAVA 开发axis2_基于Apache axis2开发Java Web服务
  8. 为什么说Pravega是流处理统一批处理的最后一块拼图?
  9. 基于CNN实现对摄像头捕捉的人脸进行性别和年龄的预测
  10. Nvivo的使用学习
  11. 用qt编写的解析tiff文件的类
  12. 数组转为集合的方法解析
  13. H264、H265编码概念及I帧P帧B帧
  14. 星球日报 | Huobi Prime 首期项目 TOP “中签率”2%,开盘暴涨 27 倍
  15. ADAS——高级驾驶辅助系统介绍
  16. 2020博客之星年度总评选,我来啦
  17. 关于修复EeePC1008Ha在Ubuntu下系统快捷键部分失灵的解决
  18. ACCFILM粉末电阻测试系统
  19. vue用户头像地址为““时,用姓名首字母做头像
  20. 还在纠结选择用什么浏览器?手机端用国产浏览器也很香

热门文章

  1. linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
  2. html文件上传添加额外参数,bootstrap-fileinput组件在上传时传递额外参数
  3. cv2.imread读取图像结果none_python cv2.imread 读取中文路径的图片返回为None的问题
  4. c语言prime函数怎么用_C语言 要发就发
  5. mysql查询语句4,MySQL(4):CRUD语句(2)——基本查询
  6. 「软件项目管理」一文详解软件项目成本计划
  7. java numberformat异常_Java NumberFormat格式化float类型的bug
  8. [SpringSecurity]web权限方案_用户认证_设置用户名密码
  9. [计组]压缩BCD码指二进制编码的十进制
  10. [JavaWeb-MySQL]多表关系介绍