第二届ACC(AcWing Cup)全国联赛 C4943. 方格迷宫

题意

题目大意就是给定一个地图,给定一个起点和终点,要求我们以最小步数到达终点,其中不可以落入陷阱并且每步可以走 1 − − k 步 题目大意就是给定一个地图,给定一个起点和终点,要求我们以最小步数到达终点,其中不可以落入陷阱并且每步可以走1--k步 题目大意就是给定一个地图,给定一个起点和终点,要求我们以最小步数到达终点,其中不可以落入陷阱并且每步可以走1k

思路

很明显是个 b f s 裸题 很明显是个bfs裸题 很明显是个bfs裸题
但要加点特殊的处理,因为每次都走 1 − k 步,然后时间复杂度会是 O ( n m k ) 但要加点特殊的处理,因为每次都走1-k步,然后时间复杂度会是O(nmk) 但要加点特殊的处理,因为每次都走1k步,然后时间复杂度会是O(nmk)
这样会超时,而且不可以用 b o o l s t [ ] [ ] 数组来判断是否遍历过,因为这样的话,前面遍历的点会对后面遍历的点产生影响,具体影响看例子 这样会超时,而且不可以用bool st[][]数组来判断是否遍历过,因为这样的话,前面遍历的点会对后面遍历的点产生影响,具体影响看例子 这样会超时,而且不可以用boolst[][]数组来判断是否遍历过,因为这样的话,前面遍历的点会对后面遍历的点产生影响,具体影响看例子


4 4 4
…#
.#.#

##…
1 1 3 4


图解
在这个例子中我们可以看到,第一步被更新的是第一行和第一列标红的1,然后第二步是第三列黑色的2和第三行第二个绿色的二,这时候我们如果用bool st[][]数组来判断的话就break了,因为第三行第三列的2被第一行第一列的那个格子更新过了,这时候就得从第三行第三列开始更新终点了,这样终点的步数就是3了,也就是错了,所以我们不可以用bool st[][]来标记是否来过,在这个情况下我们应该继续用第三行第一列的红1继续更新这一行,这个博客主要就是用来记录下这个bug!!!找了很久才找到,以后知道了,原来bfs中找最短路不可以用bool st[][]还是得需要step[][],还有部分细节写道代码注释里面了

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1010 + 10;

#define x first
#define y second

typedef pair<int, int> pii;

int n, m, k;
char a[N][N];
int step[N][N];
int s1, d1, s2, d2;
//一个究极bug,就是在bfs过程中之前的路径判断会对之后的产生影响,按照st数组做法

bool check(int xx, int yy, int x, int y)
{
    if(x < 1 || x > n || y < 1 || y > m) return false;
    if(step[x][y] == step[xx][yy]) return false;//这一句话是避免点重复判断,及时break
    if(a[x][y] == '#') return false;
    return true;
}

int bfs()
{
    queue<pii> q;
    q.push({s1, d1});
    int dx[5] = {0, 0, 1, -1};
    int dy[5] = {1, -1, 0, 0};
    memset(step, 0x3f, sizeof(step));
    step[s1][d1] = 0;
    while(q.size())
    {
        pii t = q.front();
        q.pop();
        if(t.x == s2 && t.y == d2)
        {
            return step[s2][d2];
        }
            for(int i = 0; i < 4; i ++)
            {
                for(int p = 1; p <= k; p ++)
                {
                    int tx = t.x + p*dx[i];
                    int ty = t.y + p*dy[i];
                    if(check(t.x, t.y, tx, ty))
                    {
                        //加上这一句话就把时间复杂度降到了O(n*m)
                        //因为bfs中第一次到的点就是最小距离的,所以每个点只会进一次队列
                        if(step[tx][ty] > step[t.x][t.y] + 1)
                        {   
                            step[tx][ty] = step[t.x][t.y] + 1;
                            q.push({tx, ty});
                        }
                    }
                    else
                    break;  
                }   
            }
    }
    return -1;
}


int main()
{
    cin >> n >> m >> k;
    
    for(int i = 1; i <= n; i ++)
    {
        scanf("%s", (a[i]+1));
    }
    cin >> s1 >> d1 >> s2 >> d2;
    int res = bfs();
    printf("%d\n", res);
    
    return 0;
}

链接

点击跳转

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

crud删除(1.5小时)

一、servlet删除 页面效果 删除一个重复的韩非&#xff0c;可以看到无论是list显示还是navicate全都删除成功了 编写servlet页面时一定要注意&#xff0c;我们不光要在list页面开辟一个新的单元格以及加上超链接&#xff0c;还要给它传入当前行的id参数&#xff0c;这样delete…

企业如何利用大数据精准获客

打造大数据硬核组织 运营商大数据精准获客&#xff0c;助力企业高效获客 导语 获客难、成本高一直是困扰各个企业的一大难点。在大数据获客弥漫的今天&#xff0c;我们仿佛看见了眼前影影绰绰的都是客户&#xff0c;但当伸手去抓&#xff0c;却发现寥寥无几&#xff0c;什么…

Web-Http基本概念(请求与响应)

目录 1、http请求 &#xff08;1&#xff09;get &#xff08;2&#xff09;host &#xff08;3&#xff09;accept &#xff08;4&#xff09;referer &#xff08;5&#xff09;accept-language &#xff08;6&#xff09;user-agent 2、http响应 &#xff08;1&…

Linux 文件系统是怎么工作的?

同 CPU、内存一样&#xff0c;磁盘和文件系统的管理&#xff0c;也是操作系统最核心的功能。 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 那么&#xff0c;磁盘和文件系统是怎么工作的呢&#xff1f;又有…

毕业设计源码基于springboot的旧物置换系统的实现

摘 要 随着时代在一步一步在进步&#xff0c;旧物也成人们的烦恼&#xff0c;许多平台网站都在推广自已的产品像天猫、咸鱼、京东。所以开发出一套关于旧物置换网站成为必需。旧物置换网站主要是借助计算机&#xff0c;通过对用户进行管理。为减少管理员的工作&#xff0c;同…

WEB前端作业——banner的切换

实现banner的左右切换按钮 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>div,ul,li,a,span,img{margin:0;padding:0;}#banner { overflow:hidden; width:100%; height:400px; position:rela…

火速上线zkSync Era主网,盘点SpaceFi的Web3布局

最近zkSync Era主网的上线引发了市场对Layer2的和零知识证明技术的关注&#xff0c;而作为Web3跨链应用平台的SpaceFi也在第一时间对zkSync Era进行了支持&#xff0c;并与3月28日上线DEX、Farm、Plant NFT等多个产品&#xff0c;一时间成为zkSync上的热门生态项目。打造一站式…

银行数字化转型导师坚鹏:数字化转型背景下的银行柜员提升之道

数字化转型背景下的银行柜员提升之道 课程背景&#xff1a; 很多银行都在开展银行数字化运营工作&#xff0c;目前存在以下问题急需解决&#xff1a; l 不清楚银行数字化运营包括哪些关键工作&#xff1f; l 不清楚银行数字化运营工作的核心方法论&#xff1f; l 不清楚银行数字…

【新2023Q2模拟题JAVA】华为OD机试 - 不含 101 的数

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:不含 101 的数 题目 橡皮擦…

如何正确选择7/8电连接器

7/8电连接器简称连接器&#xff0c;接线端子&#xff0c;是电子元器件的一个细分领域&#xff0c;主要用于电路与电路之间的连接。在工业生产中&#xff0c;线路连接可以说是无处不在&#xff0c;因而连接器的使用范围当然是十分广泛&#xff0c;应用在各个行业。 选择科迎法7/…

第8章_索引的创建与设计原则

第8章_索引的创建与设计原则 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff…

学剪辑难吗 如何使用会声会影2023做剪辑视频

很多剪辑初学者都问过一个问题&#xff0c;学剪辑难吗&#xff1f;其实不论学什么&#xff0c;只要用心学都不难&#xff0c;今天我们就来讲讲如何学做剪辑视频&#xff0c;感兴趣的小伙伴们不要走开&#xff01;一、学剪辑难吗 其实学剪辑并不是件难事&#xff0c;但是需要掌握…

非科班应届生培训Java能就业吗?

想要学习Java开发的同学们&#xff0c;不要再太过纠结非科班可以学Java吗&#xff1f;学历低能学Java开发吗?Java开发怎么才能学得好?没有计算机基础能学习Java开发吗&#xff1f;这些问题了。想的再多都不如行动&#xff0c;大胆努力认真踏实地学习就好。谁不是一步步来的呢…

太奇怪了!小公司面试全挂,大厂面试全过,为什么小公司要求比大厂还高?...

大厂的人才去小公司面试&#xff0c;一定是降维打击吗&#xff1f;还真未必。一位网友很困惑&#xff1a;真的奇怪&#xff0c;小公司面试全挂&#xff0c;大厂面试10个过了9个&#xff0c;感觉小公司要求比大厂还高&#xff0c;这是怎么了&#xff1f;来看看网友们的看法。有人…

Linux top 命令解析及使用

目录前言1. top 监测结果分析1.1 第一部分&#xff1a;系统整体性能分析1.1.1 第一行(top...)&#xff1a;系统状态1.1.2 第二行(Tasks...)&#xff1a;进程状态信息1.1.3 第三行(Cpus...)&#xff1a;CPU 的整体负载1.1.4 第四行(KiB Mem...)&#xff1a;Mem内存信息&#xff…

Liunx——权限

目录 shell命令以及运行原理 Linux权限的概念 Linux权限管理 01.文件访问者的分类&#xff08;人&#xff09; 02.文件类型和访问权限&#xff08;事物属性&#xff09; a) 文件类型 b)基本权限 03.文件权限值的表示方法 a)字符表示方法 b)8进制数值表示方法 04.文件…

蚂蚁面试题详细总结集锦

jdk1.7到jdk1.8 Map发生了什么变化(底层)? 1.8之后hashMap的数据结构发生了变化&#xff0c;从之前的单纯的数组链表结构变成数组链表红黑树。也就是说在JVM存 jdk1.7到jdk1.8 Map发生了什么变化(底层)? 1.8之后hashMap的数据结构发生了变化&#xff0c;从之前的单纯的数组链…

Redis分布式锁、Redisson原理

文章目录简单的分布式锁实现流程Lua脚本介绍Redisson实现分布式锁原理基本使用原理首先是lock加锁逻辑锁续命逻辑自旋重试逻辑释放锁唤醒其他阻塞线程逻辑RedLock红锁介绍与基本使用问题分布式锁性能提升简单的分布式锁实现流程 最初的版本&#xff0c;使用setnx命令加锁&…

python+appium+pytest自动化测试-参数化设置

来自APP Android端自动化测试初学者的笔记&#xff0c;写的不对的地方大家多多指教哦。&#xff08;所有内容均以微博V10.11.2版本作为例子&#xff09;在自动化测试用例执行过程中&#xff0c;经常出现执行相同的用例&#xff0c;但传入不同的参数&#xff0c;导致我们需要重复…