备战蓝桥杯---搜索(进阶2)

话不多说,直接看题:

相当于找一个点使它到3个国家的距离和min,显然,我们不可以枚举点,但是,我们可以对这3个国家分别bfs,然后枚举相加即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,v1[1005][1005],v2[1005][1005],v3[1005][1005],mm,mmm,x1,yr,x2,y2,x3,y3,min1=10000000;
char a[1005][1005],q; 
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
	int x,y,t;
};
deque<node> qq;
void bfs(int num,int v[][1005],int x,int y){
    while(!qq.empty()) qq.pop_front();
    qq.push_back({x,y,0});
	while(!qq.empty()){
		node ss=qq.front();
		qq.pop_front();
		if(v[ss.x][ss.y]!=-1) continue;
		v[ss.x][ss.y]=ss.t;
		for(int i=0;i<4;i++){
			int xx=ss.x+dir[i][0];
			int yy=ss.y+dir[i][1];
			if(xx<=0||xx>n||yy<=0||yy>m) continue;
			if(a[xx][yy]=='#') continue;
			if(v[xx][yy]!=-1) continue;
			if((a[xx][yy]-'0'>=1)&&(a[xx][yy]-'0'<=3)) qq.push_front({xx,yy,ss.t});
			else qq.push_back({xx,yy,ss.t+1});
		}
	}
}
signed main(){
	memset(v1,-1,sizeof(v1));
	memset(v2,-1,sizeof(v2));
	memset(v3,-1,sizeof(v3));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>q;
			if(q=='1'){
				x1=i;
				yr=j;
			}
			if(q=='2'){
				x2=i;
				y2=j;
			}
			if(q=='3'){
				x3=i;
				y3=j;
			}
			a[i][j]=q;
		}
	}
	bfs(1,v1,x1,yr);
	bfs(2,v2,x2,y2);
	bfs(3,v3,x3,y3);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(v1[i][j]==-1||v2[i][j]==-1||v3[i][j]==-1) continue;
			if(a[i][j]=='#') continue;
            if(a[i][j]=='.'&&min1>v1[i][j]+v2[i][j]+v3[i][j]-2)
                min1=v1[i][j]+v2[i][j]+v3[i][j]-2;
            if(a[i][j]!='#'&&min1>v1[i][j]+v2[i][j]+v3[i][j])
                min1=v1[i][j]+v2[i][j]+v3[i][j];
		}
	}
    if(min1==10000000) cout<<-1;
	else cout<<min1;}

有几点主意:

1.合并时分类讨论

2.可能存在2,3已经联通,这样的话算不在123位置上的结果就重复了导致结果偏大。

但是总有一个正确的结果可以获得,与是没有必要判断。

接题:

显然,我们最多可以通过abs(n-m)次转化,然后当数大于2*n-m就退出。

其实,负数的存在是没必要的;

于是我们可以BFS,复杂度不超过n-m;

class Solution {
public:
    int solve(int n, int m) {
    int vis[3001];
    struct node{
	int f,cnt;};
    queue<node> q;
	q.push({n,0});
	vis[n]=1;
    memset(vis,0,sizeof(vis));
	while(!q.empty()){
		node ss=q.front();
		q.pop();
		if(ss.f==m){
            return ss.cnt;
            
        }
		if(ss.cnt>abs(n-m)) continue;
		int xx=ss.f;
		for(int i=1;i<=3;i++){
			xx=ss.f;
			if(i==1) xx++;
			else if(i==2) xx--;
			else xx=xx*xx;
			if(xx<=0) continue;
			if(xx>m&&(ss.cnt+xx-m)>=abs(m-n)) continue;
            if(vis[xx]==1) continue;
			q.push({xx,ss.cnt+1});
			vis[xx]=1; 
		}
    }
        return -1;
    }
};

接题:

二进制枚举+检验即可,复杂度为(2^n*m)

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

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

相关文章

《【python】staticmethod与classmethod深度机制解析——要知其所以然》学习笔记

《【python】staticmethod与classmethod深度机制解析——要知其所以然》 1 Python中classmethod的实现机制 1.1 type_getattro(PyObject *type, PyObject *name)解析

Verilog刷题笔记19

题目&#xff1a; A common source of errors: How to avoid making latches When designing circuits, you must think first in terms of circuits: I want this logic gate I want a combinational blob of logic that has these inputs and produces these outputs I want…

KtConnect 本地连接连接K8S工具

KT Connect简介 Kt Connect &#xff08;Kubernetes Developer Tool&#xff09;是一个阿里开源、轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具。其核心是通过建立本地到集群以及集群到本地的双向通道。 1.阿里开源&#xff0c;轻量级, 2. 安装快捷简单&#xf…

年假作业day2

1.打印字母图形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int i,j; char k; for(i1;i<7;i) { for(j1;j<i;j) { printf("%c",_); } for(j0,…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

一、概述 ① 缓存穿透&#xff1a;大量请求根本不存在的key&#xff08;下文详解&#xff09; ② 缓存雪崩&#xff1a;redis中大量key集体过期&#xff08;下文详解&#xff09; ③ 缓存击穿&#xff1a;redis中一个热点key过期&#xff08;大量用户访问该热点key&#xff0c;…

很多内容网站里出现的 RSS订阅 的起源,作用,使用方式与底层原理探究,以及如何让自己的网站支持RSS订阅探讨

前言 在逛很多内容社区的时候&#xff0c;经常发现rss订阅这一选项&#xff0c;平时没有怎么理会&#xff0c;因为这与我无关&#xff0c;但是遇见多了不免产生很多好奇&#xff0c;这次专门来探究一下它。 作用 RSS订阅&#xff08;Really Simple Syndication或Rich Site Su…

C++ 11/14/17 智能指针

1. 简介 为了更加容易&#xff08;更加安全&#xff09;的使用动态内存&#xff0c;引入了智能指针的概念。智能指针的行为类似常规指针&#xff0c;重要的区别是它负责自动释放所指向的对象。 标准库提供的两种智能指针的区别在于管理底层指针的方法不同&#xff1a;shared_p…

C++进阶(十一)C++11

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C11简介二、统一的列表初始化1、&#xff5b;&#xff5d;初始化2、std::initializer_lis…

微信支付服务商,商户快速进件,减少工作量

大家好&#xff0c;我是小悟 服务商拓展特约商户&#xff0c;人工录入大量商户资料&#xff0c;耗时耗力。商户对标准费率不满意&#xff0c;无法说服商户先签约再帮其调整费率。 为了减少服务商工作量&#xff0c;服务商快速进件工具来了&#xff0c;分为移动端和管理端。用好…

【Leetcode】292. Nim 游戏

文章目录 题目思路代码结果 题目 题目链接 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每…

maven 继承

文章目录 前言一、dependencyManagement一、dependencies传递规则二、引用顺序统一声明三、maven插件默认行为声明四、动态server.name 前言 系统整理一下用到的maven继承关系 一、dependencyManagement 版本控制 <properties><!--jar版本定义 --><spring-bo…

网络编程-序列化和反序列化/应用层协议/

预备知识 理解为什么要应用层协议&#xff1f; 在学过套接字编程后&#xff0c;我们对协议的理解更深了一步&#xff0c;协议也就是一种约定&#xff0c;也可以通俗理解为一种口头约定&#xff0c;对于通信双方来说是必须要遵守的。TCP和UDP协议它们是传输层控制协议&#xf…

聚焦网络安全公司,看F5如何应对企业数字化挑战

应用无处不在的当下&#xff0c;从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。有专家指出&#xff0c;目前网络安全市场已经是仅次于计算、存储、网络的第四大IT基础设施市场。那什么网络安全公司应该具有哪些能力…

Magnet AXIOM取证神器的安装使用方法及详细教程

Magnet AXIOM取证神器的安装使用方法及详细教程 公众号&#xff1a;鱼影安全1.Magnet AXIOM取证工具介绍&#xff1a;2.Magnet AXIOM取证工具安装&#xff1a;第一步&#xff1a;第二步&#xff1a; 3.Magnet AXIOM取证工具使用方法&#xff1a; 公众号&#xff1a;鱼影安全 关…

用8086汇编语言写新春祝福

本篇目录 一、前言 1.创作背景 2.最终效果 3.必要的准备 二、实现步骤 1.程序框架 2.使程序暂停一段时间的子程序 3.显示一朵烟花的子程序 &#xff08;1&#xff09;参数 &#xff08;2&#xff09;地址转换 &#xff08;3&#xff09;显示花柄 &#xff08;4&#xff09;清除…

日本承认Omotenashi任务失败

日本在征服月球的尝试失败后承认失败 25.11.2022 日本已经取消了成为第四个登上月球的国家的申请。作为阿尔忒弥斯一号任务的一部分&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;将其Omotenashi CubeSat与NASA的SLS火箭和猎户座飞船一起送上了月球。但在…

人生,总要读几本好书!

以前&#xff0c;没有重视过读书的重要性 但是自从进入老马的陪伴群之后&#xff0c;听了老马的一路成长经历&#xff0c;才发现&#xff0c;所谓的一鸣惊人&#xff0c;都是厚积薄发的表现 大佬们在出人头地之前&#xff0c;都是有过很长一段时间的自我提升的 这个提升的方…

【数据库】创建索引的注意事项

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在数据库设计和优化中&#xff0c;索引的合理使用是提高查询性能和加速数据检索的关键因素之一。通过选…

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程&#xff0c;这个流程中会涉及到各种硬件的配置与交互&#xff0c;包…

《C程序设计》上机实验报告(六)之函数及其应用

实验内容&#xff1a; 1.运行程序 #include <stdio.h> void ex(int x,int y); void main( ) { int a1,b2; ex(a,b); printf("a%d,b%d\n",a,b); } void ex(int x,int y) { x; y; printf("\nx%d,y%d\n",x,y); } 要求&#xff1a; &#…