首页 > 其他分享 >华中师范大学2023新生赛 I 镜面折跃 题解

华中师范大学2023新生赛 I 镜面折跃 题解

时间:2023-12-20 17:48:23浏览次数:38  
标签:tx ty int 题解 华中师范大学 vector 2023 nu dis

Link

华中师范大学2023新生赛 I 镜面折跃

Question

懒得转述了

Solution

确实是一道好题

可以把一节方格拆成 \(4\) 个点,每个点分别代表从四个方向射进这个节点的光线

如果没有镜子,那么就左侧节点的右侧连接自己的右侧,以此类推

如果有镜子,那么顺着镜子方向建边,边权为 \(0\) ,向 \(90^{o}\) 方向建边,边权为 \(1\)

建边之后跑 01BFS

Code

来自某位大佬

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    cin.tie(0)->sync_with_stdio(false);
    int n, m, k;
    cin >> n >> m >> k;
    vector<vector<int>> a(n + 5, vector<int>(m + 5, -1));
    vector ok = a;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            ok[i][j] = 1;
        }
    }
    ok[n][m + 1] = 1;
    for (int i = 1; i <= k; i++) {
        int x, y, t;
        cin >> x >> y >> t;
        a[x][y] = t;
    }
    using tup = tuple<int, int, int>;
    deque<tup> q;
    const vector<pair<int, int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    const int inf = 1e9;
    vector<vector<vector<int>>> dis(n + 5, vector<vector<int>>(m + 5, vector<int>(5, inf)));
    dis[1][1][0] = 0;
    q.emplace_back(1, 1, 0);
    while (q.size()) {
        auto [x, y, u] = q.front();
        q.pop_front();
        if (a[x][y] == -1) {
            auto [dx, dy] = dir[u];
            int tx = x + dx, ty = y + dy;
            if (ok[tx][ty] == -1) continue;
            if (dis[x][y][u] < dis[tx][ty][u]) {
                dis[tx][ty][u] = dis[x][y][u];
                q.emplace_front(tx, ty, u);
            }
        } else {
            for (int t : {0, 1}) {
                int w = (t != a[x][y]);
                int nu = u ^ (1 + t + t);
                auto [dx, dy] = dir[nu];
                int tx = x + dx, ty = y + dy;
                if (ok[tx][ty] == -1) continue;
                if (dis[x][y][u] + w < dis[tx][ty][nu]) {
                    dis[tx][ty][nu] = dis[x][y][u] + w;
                    if (w == 0) q.emplace_front(tx, ty, nu);
                    else q.emplace_back(tx, ty, nu);
                }
            }
        }
    }
    int res = dis[n][m + 1][0];
    if (res > inf / 2) res = -1;
    cout << res << '\n';
    return 0;
}

Summary

  • 可以用异或来代表左转或者右转,例如 右:\(0\),下:\(1\),左:\(2\),上:\(3\)
    那么 \(t=0\) 表示左转,\(t=1\) 表示右转,\(u\) 代表现在的方向,\(nxt\) 代表接下来的方向,\(nxt=u \oplus (1+t+t)\)

  • 判断出界的情况可以以外开一个数组 \(ok\) 来判断

  • 可以不需要把点实际拆出来,用数组表示就可以了

标签:tx,ty,int,题解,华中师范大学,vector,2023,nu,dis
From: https://www.cnblogs.com/martian148/p/17917087.html

相关文章

  • 题解 Gym 102341B【Bulbasaur】/ SS231107C【爬梯高手】
    题解SS231107C【爬梯高手】撞原了,好耶!Gym102341B顺便把我的变异加强版爆标了!!!problem有一个\(n*m\)个点的有向分层图,共有\(n\)层,每层\(m\)个点,每条边一定是从第\(i\)层连向第\(i+1\)层。定义\(f(i,j)\)表示选择若干条路径,每条路径从第\(i\)层出发,在第\(j\)......
  • 2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组。 两个子数
    2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组。两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少?如果没有有效方法,返回-1。正式:2<=n<=10^60<=arr[i]<=100001<=T<=10^8扩展:2<=n<=10^6-10000<=a......
  • 2023-12-20 前几天看新闻,杀人犯逃跑的二十年,有感,今天记录
    2023-12-20     前几天看新闻,有个女杀人犯逃跑的二十年,被抓了执行死刑了。她那二十年,那叫一个岁月静好,养了两条狗,谈钢琴,画画。    就忽然觉得,我的人生过得太苟且了,还不如一个杀人犯。太无趣了。每天就是上班下班,刷手机,睡觉。要发展一点自己的爱好。    ......
  • U388010 题解
    洛谷U388010题解link:https://www.luogu.com.cn/problem/U388010Sol首先,我们看到这一条件:对于每一个\(1\lei\len\),\(1\lej\len\),\(i\neqj\)满足\(a_i\bmoda_j\neq0,\a_j\bmoda_i\neq0\)。我们知道,质数的因数只有\(1\)和本身,所以当序列里全是质数......
  • 博睿数据参与支持2023年度证券期货业标准研究课题获评“优秀”
    近期,全国金融标准化技术委员会证券分技术委员会发布《关于公布2023年度证券期货业标准研究课题结题评审结果的通知》,由西南证券独立申报、博睿数据提供系统支持的课题《证券期货业移动互联网应用程序性能指标及检测模型研究》,在2023年度证券期货业标准研究课题结题评审工作中获评“......
  • 下载图片中文乱码问题解决记录
    1.问题背景需求需要做一个场所码下载的需求,后端接口实现使用的是AWT[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑字体,而测试环境使用的是docker部......
  • 2023.12.20闲话——对埃及分数的另一种做法(?)
    昨天教室里进来一只母猫,还很可爱的,被同学围着叫学姐(埃及分数大家都很了解,是一个迭代加深搜索的经典题。但是我突发奇想想到一个不用搜索(但是枚举)的做法。很容易可以发现右边的式子通分之后的分母一定是式子左边约分后分母的倍数。于是我们可以枚举右边式子通分后的分母,然后选......
  • 2023最新高级难度Spring Web Flow面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-高级难度SpringWebFlow面试题合集](https://offer.houxu6.top/tag/SpringWebFlow)问:请您详细解释在SpringWebFlow中如何实现复杂业务流程的嵌套和组合?在SpringWebFlow中,实现复杂业务流程的嵌套和组合可以通过以下步骤来完成:......
  • 2023最新初级难度算法面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度算法面试题合集问:什么是排序?说出常见的排序算法有哪几种?排序是计算机科学中的一种基本操作,它将一组数据按照某种顺序进行排列。排序算法是实现排序过程的具体方法。常见的排序算法有多种,它们可以根据不同的数据结构、时间复杂......
  • Why Choose Noregon JPRO Professional Diagnostic 2023 v3 Software?
     Welcometotheworldofautomotivediagnostics,whereprecisionmeetsefficiency.WiththeNoregonJPROProfessionalDiagnostic2023v3software,mechanics,technicians,andautomotiveenthusiastscanrevolutionizethewaytheyapproachvehiclediagnost......