首页 > 其他分享 >题解 - 幻象迷宫

题解 - 幻象迷宫

时间:2024-07-09 17:53:13浏览次数:10  
标签:int 题解 bmod 迷宫 幻象 verb define man

题目 in 洛谷题目 in CF

题目

幻象迷宫可以认为是无限大的,不过它由若干个 \(N\times M\) 的矩阵重复组成。矩阵中有的地方是道路,用 \(\verb!.!\) 表示;有的地方是墙,用 \(\verb!#!\) 表示。起始位置用 \(\verb!S!\) 表示。也就是对于迷宫中的一个点 \((x,y)\),如果 \((x \bmod n,y \bmod m)\) 是 \(\verb!.!\) 或者 \(\verb!S!\),那么这个地方是道路;如果 \((x \bmod n,y \bmod m)\) 是 \(\verb!#!\),那么这个地方是墙。你可以向上下左右四个方向移动,当然不能移动到墙上。

你能否走出幻象迷宫?

思路简析

一个显而易见的想法是如果能从起点出发再能到一个边缘且该边缘的对面还有路能通向起点就是成功。

hack1:

S.#..
#####
#...#

一个更强力的 hack2:

.#.
###
.#S

正确的思路是记录两组 \((x, y)\),一组是经过取模的,另一组是没有取过模的。显然如果又经过了一个点,而未取模的点对与上次经过时不同那么显然你已经绕了一圈了,此时是 Yes;但是如果你不能到无限远,那说明你只能到有限个格,dfs 不会 RE。

这个代码细节比较多。

代码实现

Time complexity:\(O(n\cdot m)\)

#include<bits/stdc++.h>
using namespace std;
namespace {
#define filein(x) freopen(x".in", "r", stdin)
#define fileout(x) freopen(x".out", "w", stdout)
#define files(x) filein(x), fileout(x)
using namespace std;
#define ll long long
#define db double

const int man = 1.5e3+10;
const int dis[5][3] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
}

int n, m, X, Y, f;
int mp[man][man], vis[man][man][3];
void dfs (int, int, int, int) ;
int main () {
#ifndef ONLINE_JUDGE
    files("test");
#endif
    while (scanf("%d%d", &n, &m) != EOF) {
        f = 0;
        for (int i = 1; i <= n; ++ i) for (int j = 1; j <= m; ++ j) {
            char c;
            scanf(" %c ", &c);
            mp[i][j] = (c!='#');
            vis[i][j][0] = vis[i][j][1] = vis[i][j][2] = 0;
            if (c == 'S') X = i, Y = j;
        } dfs(X, Y, X, Y);
        puts(f? "Yes": "No");
    } return 0;
}

// ---

void dfs (int x, int y, int orx, int ory) {
    // printf("%d %d %d %d\n", x, y, orx, ory);
    if (vis[x][y][0]) return f = (vis[x][y][1]!=orx||vis[x][y][2]!=ory), void();
    vis[x][y][0] = 1, vis[x][y][1] = orx, vis[x][y][2] = ory;
    // printf("%d %d  %d\n", x, y, vis[x][y][0]);
    for (int i = 0; i < 4; ++ i) {
        int gx = x+dis[i][0], gy = y+dis[i][1];
        gx = (gx+n-1)%n+1, gy = (gy+m-1)%m+1;
        // printf("%d %d\n", gx, gy);
        if (mp[gx][gy]) dfs(gx, gy, orx+dis[i][0], ory+dis[i][1]);
        if (f) break; //attention, it shouid be broken there, becuse f is changed as (vis[x][y][1]!=orx||vis[x][y][2]!=ory).
    } return void();
}

标签:int,题解,bmod,迷宫,幻象,verb,define,man
From: https://www.cnblogs.com/stamorlin/p/18292203/solution-Infinite_Maze

相关文章

  • UVA12342 Tax Calculator 题解
    题目传送门题目大意题目描述某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则:所得税免征额为180000180000......
  • P10719 的题解
    (一)设\(a_{x,y}\)为从\((1,1)(x,y)\)矩形中的\(1\)的数量。然后通过二位前缀和可以\(O(1)\)算。注意到\(1\len,m\le100\)。先确定矩形右下角,对于左上角,先确定在哪一行,再二分在哪一列。(二)AC代码。#include<bits/stdc++.h>#definepbpush_back#definefifirs......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • zxx题单的题解
    https://www.luogu.com.cn/training/168096CF1359ELemma:\(\forallx\in\mathbb{N},\x\bmoda\bmodb=x\bmodb\bmoda\iffa\midb\(a<b)\)Proof:因为\(a<b\),所以\(x\bmoda\bmodb=x\bmoda\)。设\(x=pb+q\),其中\(0<q<b......
  • PostgreSQL的AutoVacuum原理及autovacuum不工作问题解析
    1、AutoVacuum概述PostgreSQL数据库是有数据清理的,有人工执行清理,也有自动清理,但是这2种的清理方式对性能是有不同的影响,特别是OLTP环境中,每次不管是人工清理还是自动清理deadtuple,都会对数据库的IO有明显的影响,基于PostgreSQL的原理每个表中的行会存在多个版本的数据,为了完成......
  • 2024码蹄杯职高省赛第三场初赛全题解
    其实吧对于码蹄杯省赛的话,第三场是一千五百多人,百分之25的获奖率,然后前四百名左右就可以获奖,根据排行来看大概是六题左右,其中大概就四题要点脑子,其余的基本上属于语法题,也就是13题中如果语法没问题的话,九题是很轻松的,因为都是青铜白银题,语法没问题的话就OK的,然后就是一个P序列,......
  • 题解(2024.7.8贪心)
    1.Teleporters(HardVersion)题意:有n+2个位置:0~n+1,给定n个数\(a_1\)~\(a_n\),有以下操作:向左/右移动一格,代价为1。传送回0位置或者n+1位置,记你当前的位置为i,则代价为\(a_i\)。每个位置只能发动一次传送。求最大传送次数思路:因为每次传送都会回到0/n+1号点,所以,到......
  • 基础算法训练题单之排序(从入门到入土)——题解
    A.P1177【模板】排序三种方法:快速排序,归并排序,STL库的sort函数。法一、三:https://www.cnblogs.com/expect-999/p/17594345.html法二:https://www.cnblogs.com/expect-999/p/17599008.htmlB.P1923【深基9.例4】求第k小的数模板题目,直接对数组进行升序排序,如果数组从......
  • Codeforces Round 953(Div.2) 题解(A-E)
    CodeforcesRound953(Div.2)题解(A-E)A题意Alice有n本书,第一本书有\(a_1\)页,序号为1,第二本书有\(a_2\)页,序号为2,……,第n本书有\(a_n\)页,序号为n。Alice将把所有书分成两堆,并阅读每一堆中序号最大的一本书。Alice喜欢读书,请你告诉她,她最多可以读多少页的书。Solution第......
  • 题解:洛谷 P1890 gcd区间
    题解:洛谷P1890gcd区间标签:线段树,st表,分块,dp题意给定数列\(a\),有\(m\)次询问求区间\([l,r]\)的最大公约数。思路这道题有多种写法,如标签所示。线段树线段树可以维护具有结合性的操作,很明显\(\gcd\)满足。这道题线段树跑的慢是因为无修改操作,自然没有其他\(O(1)......