牛客小白月赛75D题题解

news2024/11/13 11:31:55

文章目录

  • [ 矩阵](https://ac.nowcoder.com/acm/contest/60063/D)
    • 问题建模
    • 问题分析
      • 1.分析所求
        • 代码

矩阵

在这里插入图片描述

问题建模

给定一个n*m的字符矩阵,字符矩阵内包含两种字符’0’和’1’,从(1,1)出发,每次可以花费一单位时间向上下左右移动,若要到达格子与当前格子的字符不同则可以走到该位置,若不同可以花费一单位时间修改要到达格子的字符,才能走到,问到达(n,m)所需的最短单位时间为多少。

问题分析

1.分析所求

从(1,1)到(n,m)的最短时间问题,可以通过跑bfs的最短路来得到。由于相邻格子间能否移动与格子上的字符有关,则可以采用分层图,来维护格子上为不同字符时,所得到的最短距离,最终取到终点的最短距离即可。

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =1e3+10,INF=0x3f3f3f3f;
string g[N];
int d[N][N][2];///两层的状态图
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;
struct Node{
    int x,y,c;
};


void bfs(){
    memset(d,INF,sizeof(d));
    queue<Node> q;
    q.push({0,0,g[0][0]-'0'});
    d[0][0][g[0][0]-'0']=0;

    while(q.size()){
        auto qt=q.front();
        q.pop();
        int x=qt.x,y=qt.y;
        for(int i=0;i<4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx<0||nx>=n||ny<0||ny>=m)    continue;
            ///若从当前点到达目标点的距离更短,则更新目标点最短距离
            if(d[nx][ny][qt.c^1]>d[x][y][qt.c]+1+(g[nx][ny]-'0'==qt.c)){
                d[nx][ny][qt.c^1]=d[x][y][qt.c]+1+(g[nx][ny]-'0'==qt.c);
                q.push({nx,ny,qt.c^1});
            }
        }
    }
}

void solve() {
    cin >>n >>m;
    for(int i=0;i<n;i++)    cin >>g[i];
    bfs();
    cout <<min(d[n-1][m-1][0],d[n-1][m-1][1]) <<"\n";
}


int main() {
    int t = 1;
    //cin >> t;
    while (t--) solve();
    return 0;
}

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

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

相关文章

Gradle(一)Windows下安装

目录 一、简介二、下载和安装1.下载2.配置环境变量3.指定个人用户目录4.验证 三、IDEA 设置 Gradle 官网地址&#xff1a;https://gradle.org/官方文档&#xff1a; https://docs.gradle.org/current/userguide/userguide.html下载地址&#xff1a; https://gradle.org/release…

16.5.3 【Linux】SELinux 三种模式的启动、关闭与观察

并非所有的 Linux distributions 都支持 SELinux 的&#xff0c;所以你必须要先观察一下你的系统版本为何。 目前 SELinux 依据启动与否&#xff0c;共有三种模式&#xff0c;分别如下&#xff1a; enforcing&#xff1a;强制模式&#xff0c;代表 SELinux 运行中&#xff0c;…

Codeforces算法心得——A. Array Coloring

大家好&#xff0c;我是晴天学长&#xff0c;确实全世界最大的算法竞赛平台有很多独特且创新的地方&#xff0c;后面我会持续的更新的&#xff01;加油&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;A. Array Coloring 2) .算法思路 数组中的奇数个数一…

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——注意力分数&#xff08;详细数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

导读-Linux简介

Linux简介 ​ 总所周知&#xff0c;计算机系统包含硬件和软件两部分。硬件部分被称为裸机&#xff0c;主要包括中央处理器&#xff08;CPU&#xff09;、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…

Leetcode Top 100 Liked Questions(序号53~74)

53. Maximum Subarray 题意&#xff1a;一个数组&#xff0c;找到和最大的子串 我的思路 我记得好像On的动态规划来做的&#xff1f;但是想不起来了&#xff0c;先死做&#xff0c;用的前缀和——TLE超时 那就只能想想dp怎么做了 假设dp[i]表示的是以 i 为右端点的最大的…

在医疗行业数字孪生能做些什么?

数字孪生技术随着发展正在多行业遍地开花&#xff0c;在之前的文章中也为大家介绍过数字孪生的行业应用&#xff0c;今天带大家一起探讨一下数字孪生在医疗行业的表现。其实数字孪生在医疗行业已有很多应用案例&#xff0c;从医疗诊断到手术模拟&#xff0c;再到药物研发&#…

android内存分析工具记录,请利用好最后2个神器

相机见证了java内存暴增和native持续增长的问题&#xff0c;因此这里记录一下使用的工具情况&#xff0c;方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具&#xff0c;配置也很简单&#xff0c;直接在build.gradle中添加依赖即可&#xff1a; …

Java语言怎么输出有颜色的字符串呢?

在Java中&#xff0c;我们应该如何输出有颜色的文字字符串呢&#xff1f; 目录 一、使用方法 二、举例说明 三、常见的颜色及其对应的ANSI转义序列 一、使用方法 在Java中&#xff0c;可以使用ANSI转义序列来改变输出文本的颜色。 二、举例说明 &#xff08;1&#xff…

【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366

场景&#xff1a;c#使用mysql数据库执行数据库迁移&#xff0c;使用了新增inserter的语句&#xff0c;然后报错 报错如下&#xff1a; 1.MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: ‘\xE6\x9B\xB4\xE6\x94\xB9…’ for column ‘Migratio…

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

安科瑞变电所运维平台在电力系统中应用分析

摘要&#xff1a;现代居民生活、工作对电力资源的需求量相对较多&#xff0c;给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成&#xff0c; 将变电运维安全管理以及相应的设备维护工作系统性开展&#xff0c;能够根据项目实践工作要求&#xff0c;将满足要求…

【讨论】视频监控集中存储方案如何做?

视频监控集中存储是指将多个视频监控摄像头所捕捉到的视频信号集中存储于一个中央设备&#xff0c;这个中央设备可以是服务器、网络存储设备或其他专用设备。通过集中存储&#xff0c;可以避免因为存储设备分散而导致的管理不便和难以有效地管理和检索视频数据&#xff0c;同时…

iTOP-RK3568开发板ubuntu环境下安装Eclipse

eclipse 是使用 Java 语言开发的&#xff0c;一个 Java 应用程序&#xff0c;这意味着 eclipse 只能运行在 Java虚拟机上。倘若没有安装 JDK&#xff08;Java Development Kit&#xff09;&#xff0c;即使在 ubuntu 上安装了 eclipse&#xff0c;也不能运行&#xff0c;所以要…

软文发布问题解答:高效宣传与推广指南

以下是一秒推小编针对软文发布的20个常见问题及回答&#xff1a; 1. 什么是软文&#xff1f; 答&#xff1a;软文是指用文学手法、写作技巧撰写的宣传文章&#xff0c;以实现对特定受众的陈述、说明和推销。 2. 发布软文的目的是什么&#xff1f; 答&#xff1a;发布软文的目…

奥威BI数据可视化工具:360度呈现数据,告别枯燥表格

随着企业数据量的不断增加&#xff0c;如何有效地进行数据分析与决策变得越来越重要。奥威BI数据可视化工具作为一款强大的数据分析工具&#xff0c;在帮助企业深入挖掘数据价值方面具有显著优势。 奥威BI数据可视化工具是一款基于数据仓库技术的数据分析工具&#xff0c;具有…

RTT(RT-Thread)ADC设备(RTT保姆级介绍)

目录 ADC设备 前言 ADC相关参数说明 访问ADC设备 配置ADC设备 ADC实例 硬件设计 软件设计 ADC设备 前言 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 对于ADC的详细介绍和在STM32中的裸机应用可参考以下…

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 2.1 OFDM原理 2.2 64QAM调制 2.3 载波同步 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................…

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性