Atcoder-ABC-431-E

news/2025/11/14 12:48:55/文章来源:https://www.cnblogs.com/Red-river-hzh/p/19203972

### TOYOTA SYSTEMS Programming Contest 2025(AtCoder Beginner Contest 431)
DFS

E - 网格反射

 

问题陈述

 

有一个带有行和列的网格。我们将顶部的第 - 行和左侧的第 - 列的单元格称为 单元格 。每个单元格上最多放置一面镜子。HWij(i,j)

 

高桥站在牢房的左侧,青木站在牢房的右侧。高桥拿着手电筒,从牢房的左侧向右照射光线。在这里,假设手电筒的光不会漫射,并且是直线传播的光线。(1,1)(H,W)(1,1)

 

高桥的目标是利用网格中的镜子将手电筒的光线传递给青木。

 

镜子放置分为三种类型。当光线照射到镜子上时,光线的方向会根据镜子的位置而变化。对于每个镜子放置,每个入口方向的退出方向如下图所示。

 

  • A型(不放置镜子)

 

 

  • B型(连接左上和右下的对角线上放置一面镜子)

 

 

  • C型(镜子放置在连接右上和左下的对角线上)

 

 

网格上的镜子位置由长度为 : 的字符串表示。当 的第 - 个字符是 时,cell 是 A 型;当它是时,细胞是B型;当它是时,单元格是 C 型。HWS1,S2,,SHjSiA(i,j)B(i,j)C(i,j)

 

高桥可以执行以下作任意次数,将光线传递给青木:

 

  • 选择一个单元格并将该单元格的镜像位置更改为其他类型。

 

找到向青木输送光线所需的最少作次数。

 

你会得到测试用例;找到每个的答案。T


```cpp

#include<bits/stdc++.h>
#define wk(x) write(x),putchar(' ')
#define wh(x) write(x),putchar('\n')
#define int long long
#define INF 2147483647
#define mod 998244353
#define N 610005
#define NO printf("No\n")
#define YES printf("Yes\n")

using namespace std;
int n,m,k,jk,ans,sum,num,cnt,tot;
int dis[N],vis[N][5],f[N];
char a[N];

void read(int &x){
    x=0;int ff=1;char ty;
    ty=getchar();
    while(!(ty>='0'&&ty<='9')){
        if(ty=='-') ff=-1;
        ty=getchar();
    }
    while(ty>='0'&&ty<='9')
        x=(x<<3)+(x<<1)+ty-'0',ty=getchar();
    x*=ff;return;
}

void write(int x){
    if(x==0){
        putchar('0');
        return;
    }
    if(x<0){
        x=-x;
        putchar('-');
    }
    char asd[201];int ip=0;
    while(x) asd[++ip]=x%10+'0',x/=10;
    for(int i=ip;i>=1;i--) putchar(asd[i]);
    return;
}

struct Q{
    int sum,x,y,fx;
    bool operator<(const Q&A)const{
        return A.sum<sum;
    }
};

priority_queue<Q> q;
/*
1:->
2:^
3:v
4:<-
*/
int pd(int x,int fx){
    if(x==1){
        return fx;
    }else if(x==2){
        if(fx==1) return 3;
        if(fx==2) return 4;
        if(fx==3) return 1;
        if(fx==4) return 2;
    }else{
        if(fx==1) return 2;
        if(fx==2) return 1;
        if(fx==3) return 4;
        if(fx==4) return 3;
    }return 0;
}

pair<int,int> G(int x,int y,int fx){
    if(fx==1) return {x,y+1};
    if(fx==2) return {x-1,y};
    if(fx==3) return {x+1,y};
    if(fx==4) return {x,y-1};
    return {0,0};
}

void bfs(){
    while(!q.empty()) q.pop();
    q.push((Q){0,1,1,1});
    while(!q.empty()){
        Q A=q.top();q.pop();//wk(A.x),wk(A.y);wh(A.sum);
        if(A.x==n&&A.y==m+1&&A.fx==1) {ans=A.sum;return;}
        if(A.x<1||A.y<1||A.x>n||A.y>m||vis[A.x*m+A.y][A.fx]!=2e9) continue;
        vis[A.x*m+A.y][A.fx]=A.sum;
        if(a[A.x*m+A.y]=='A'){
            pair<int,int> to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(2,A.fx)});
            to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(3,A.fx)});
        }else if(a[A.x*m+A.y]=='B'){
            pair<int,int> to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(2,A.fx)});
            to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(3,A.fx)});
        }else{
            pair<int,int> to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(3,A.fx)});
            to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(2,A.fx)});
        }
    }
}

signed main()
{
    read(jk);while(jk--){
        read(n),read(m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                char ch=getchar();
                while(ch!='A'&&ch!='B'&&ch!='C') ch=getchar();
                a[i*m+j]=ch;
            }
        }
        for(int i=0;i<=n*m+m;i++) vis[i][1]=vis[i][2]=vis[i][3]=vis[i][4]=0;
        vis[n*m+m+1][1]=2e9;
        for(int i=m+1;i<=n*m+m;i++) vis[i][1]=vis[i][2]=vis[i][3]=vis[i][4]=2e9;
        ans=2e9;bfs();wh(ans);
    }
    return 0;
}

```

#include<bits/stdc++.h>
#define wk(x) write(x),putchar(' ')
#define wh(x) write(x),putchar('\n')
#define int long long
#define INF 2147483647
#define mod 998244353
#define N 610005
#define NO printf("No\n")
#define YES printf("Yes\n")

using namespace std;
int n,m,k,jk,ans,sum,num,cnt,tot;
int dis[N],vis[N][5],f[N];
char a[N];

void read(int &x){
    x=0;int ff=1;char ty;
    ty=getchar();
    while(!(ty>='0'&&ty<='9')){
        if(ty=='-') ff=-1;
        ty=getchar();
    }
    while(ty>='0'&&ty<='9')
        x=(x<<3)+(x<<1)+ty-'0',ty=getchar();
    x*=ff;return;
}

void write(int x){
    if(x==0){
        putchar('0');
        return;
    }
    if(x<0){
        x=-x;
        putchar('-');
    }
    char asd[201];int ip=0;
    while(x) asd[++ip]=x%10+'0',x/=10;
    for(int i=ip;i>=1;i--) putchar(asd[i]);
    return;
}

struct Q{
    int sum,x,y,fx;
    bool operator<(const Q&A)const{
        return A.sum<sum;
    }
};

priority_queue<Q> q;
/*
1:->
2:^
3:v
4:<-
*/
int pd(int x,int fx){
    if(x==1){
        return fx;
    }else if(x==2){
        if(fx==1) return 3;
        if(fx==2) return 4;
        if(fx==3) return 1;
        if(fx==4) return 2;
    }else{
        if(fx==1) return 2;
        if(fx==2) return 1;
        if(fx==3) return 4;
        if(fx==4) return 3;
    }return 0;
}

pair<int,int> G(int x,int y,int fx){
    if(fx==1) return {x,y+1};
    if(fx==2) return {x-1,y};
    if(fx==3) return {x+1,y};
    if(fx==4) return {x,y-1};
    return {0,0};
}

void bfs(){
    while(!q.empty()) q.pop();
    q.push((Q){0,1,1,1});
    while(!q.empty()){
        Q A=q.top();q.pop();//wk(A.x),wk(A.y);wh(A.sum);
        if(A.x==n&&A.y==m+1&&A.fx==1) {ans=A.sum;return;}
        if(A.x<1||A.y<1||A.x>n||A.y>m||vis[A.x*m+A.y][A.fx]!=2e9) continue;
        vis[A.x*m+A.y][A.fx]=A.sum;
        if(a[A.x*m+A.y]=='A'){
            pair<int,int> to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(2,A.fx)});
            to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(3,A.fx)});
        }else if(a[A.x*m+A.y]=='B'){
            pair<int,int> to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(2,A.fx)});
            to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(3,A.fx)});
        }else{
            pair<int,int> to=G(A.x,A.y,pd(3,A.fx));
            if(vis[to.first*m+to.second][pd(3,A.fx)]==2e9) q.push((Q){A.sum,to.first,to.second,pd(3,A.fx)});
            to=G(A.x,A.y,pd(1,A.fx));
            if(vis[to.first*m+to.second][pd(1,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(1,A.fx)});
            to=G(A.x,A.y,pd(2,A.fx));
            if(vis[to.first*m+to.second][pd(2,A.fx)]==2e9) q.push((Q){A.sum+1,to.first,to.second,pd(2,A.fx)});
        }
    }
}

signed main()
{
    read(jk);while(jk--){
        read(n),read(m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                char ch=getchar();
                while(ch!='A'&&ch!='B'&&ch!='C') ch=getchar();
                a[i*m+j]=ch;
            }
        }
        for(int i=0;i<=n*m+m;i++) vis[i][1]=vis[i][2]=vis[i][3]=vis[i][4]=0;
        vis[n*m+m+1][1]=2e9;
        for(int i=m+1;i<=n*m+m;i++) vis[i][1]=vis[i][2]=vis[i][3]=vis[i][4]=2e9;
        ans=2e9;bfs();wh(ans);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空间线性的线段树分治

省流:下面有代码框架。先看一个朴素做法。 仍然是线段树,每个节点开一个 vector。 对于每个区间修改,我们维护 \(l, r\) 和需要进行的修改,全都扔到根节点的 vector 里面。 然后 dfs 整棵树,到达节点 \(i\) 时,将…

2025年石棉橡胶板厂家联系方式推荐:品质服务双保障

在工业密封材料领域,石棉橡胶板因其耐高温、耐油、耐酸碱及优异的压缩回弹性能,仍是电力、石化、冶金、造船等行业管道法兰、压力容器密封的首选。2025年,随着设备检修周期缩短、项目集中开工,用户对“靠谱厂家+快…

2025年石棉橡胶板厂家联系方式推荐:质量认证齐全厂商盘点

在工业密封材料采购中,石棉橡胶板因耐高温、耐油、耐酸碱等特性,仍是电力、石化、冶金、造船等行业的刚需。2025年,随着设备升级周期缩短,企业对板材的交货速度、环保指标、售后响应提出更高要求。如何快速锁定货源…

两款开源工具推荐:科学信息检索导航 LaTeX 在线阅读器,科研效率提升利器!

在信息密度日益增长的时代,科研工作者、学生和开发者都面临着一个共同问题:如何快速获取高质量信息、如何高效处理学术文档?今天推荐两款由 Mutantcat Working Group 开发的开源工具,分别面向科学信息检索与 LaTeX…

2025年AI客服品牌最新top4专业评测:AI销冠在线自动回复

随着人工智能技术的深度发展,AI客服已成为企业提升服务效率、降低运营成本的核心工具。本榜单基于技术先进性、功能完整性、服务覆盖度、用户口碑四大维度,结合行业调研数据及企业实际应用反馈,对2025年主流AI客服服…

2025年石棉橡胶板厂家联系电话推荐:全国供货渠道大全

在工业密封材料采购中,石棉橡胶板因其耐高温、耐油、耐酸碱的特性,被广泛应用于电力、石化、冶金、造船等关键领域。2025年,随着设备维护周期缩短、工程项目集中开工,市场对“现货快、质量稳、价格合理”的石棉橡胶…

C++STL_1

template类(模板函数类): 1.template T Max(T x, T y){ if(x > y){ return x; }else{ return y; } } 这是一个模板类的例子----->> T可以是任何类型 2. 以上述的Max函数为例:Max(x,y)----->>隐式 Ma…

完整教程:毕设项目基于python的旅游文化推广管理系统\251019(白嫖源码+演示录像)可做计算机毕设JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、文案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年AI获客服务商最新top5评测:数据分析、市场预测、客户服务多场景覆盖

随着人工智能技术在商业领域的深度渗透,AI获客已成为企业突破增长瓶颈的核心战略。本榜单基于技术创新性、行业适配度、服务实效性三大维度,结合企业实际案例反馈,权威解析2025年广东地区五大AI获客品牌综合实力,为…

2025年比较好的工装定制TOP实力厂家推荐榜

2025年比较好的工装定制TOP实力厂家推荐榜行业背景与市场趋势随着企业形象管理意识的不断提升,工装定制行业正迎来新一轮发展机遇。据中国服装协会2024年发布的《中国职业装行业发展报告》显示,2023年中国职业装市场…

2025年11月天津电商财税公司排名:五强口碑与能力综合评测

站在2025年末的节点,天津跨境电商综试区政策红利持续释放,电商卖家面临“多平台收入对账、出口退税时效、境内外主体合规”三重夹击。很多创始人白天盯运营、晚上对报表,稍不留神就触发税务预警;有人刚准备融资,却…

11.14 完成项目计划管理系统(idea中使用Mysql(9.4)Tomcat(11)jdk(21.0.8)) - GENGAR

一. 创建项目 注意:项目属性选择java 构建系统选择Maven 演示图片所用jdk版本为21.0.8二. 连接数据库 注意:演示图片Mysql版本为9.4 确保数据库已经打开 (1)首先检查Mysql是否已经打开 同时按住win+R,显示如下界面…

2025年11月天津电商财税公司榜单:五家服务商综合对比与选型建议

双十一刚过,天津跨境电商卖家林先生在整理平台结算单时发现:境内平台已代扣代缴,境外平台却仍需自行申报出口退税;同时,公司小规模纳税人身份即将突破500万元销售额,若不及时升级为一般纳税人,发票链将断裂,订…

2025年知名的工程级液压浴室夹厂家最新实力排行

2025年知名的工程级液压浴室夹厂家最新实力排行行业背景与市场趋势随着建筑装修行业向高品质、精细化方向发展,工程级液压浴室夹作为卫浴五金的关键部件,其市场需求持续增长。据中国五金制品协会最新数据显示,2024年…

2025年口碑好的电视柜缓冲铰链高评价厂家推荐榜

2025年口碑好的电视柜缓冲铰链高评价厂家推荐榜行业背景与市场趋势随着家居智能化与品质化需求的不断提升,电视柜作为客厅核心家具之一,其功能性与耐用性日益受到消费者重视。据中国五金制品协会2024年数据显示,国内…

2025年热门的温室生长灯热门厂家推荐榜单

2025年热门的温室生长灯热门厂家推荐榜单行业背景与市场趋势随着全球农业现代化进程加速和设施农业的蓬勃发展,温室生长灯作为现代农业的核心装备之一,正迎来前所未有的市场机遇。据国际农业照明协会(IAL)最新报告显…

智谱智能体接入

1、Post地址: $url = "https://open.bigmodel.cn/api/llm-application/open/v3/application/invoke" 2、写入Bearer 3、json格式:{"app_id": "8022231040","conversation_id&quo…

2025年口碑好的双螺杆清洗料厂家最新推荐排行榜

2025年口碑好的双螺杆清洗料厂家最新推荐排行榜行业背景与市场趋势随着塑料加工行业的快速发展,双螺杆清洗料作为生产过程中不可或缺的辅助材料,其市场需求呈现稳定增长态势。据中国塑料加工工业协会最新数据显示,2…

2025年质量好的玻璃温室智能厂家最新实力排行

2025年质量好的玻璃温室智能厂家最新实力排行行业背景与市场趋势随着现代农业技术的快速发展和国家对智慧农业的政策支持,玻璃温室产业迎来了前所未有的发展机遇。据中国农业机械化协会温室园艺分会最新数据显示,202…

P8127 [BalticOI 2021] The Xana coup (Day2) 分析

题目概述 给你一颗树并且每个点上面有点权,你可以进行一次操作:选择一个点将他自己和与他距离为 \(1\) 的点的点权全部异或 \(1\)。 求最少多少次操作使得每个点的点权都是 \(0\)。 分析 遇到这种题目,一般都是先考…