安排超市 -- BFS分割搜索

news2024/11/24 18:40:21

4.安排超市
给定一个n*n的地图。地图是上下左右四联通的,不能斜向行走:
*代表障碍,不可通行。
.代表路,可以通行。
#代表房子。房子也是可以通行的。

小红现在需要在一些地方安排一些超市(不能安排在障碍物上,可以安排在路上或者房子上。超市也是可以通行的)。
小红希望每个房子至少可以到达一个超市。同时由于成本原因,小红希望超市的数量尽可能少。
在超市数量最少的情况下,小红希望每个房子到达最近的超市的距离之和尽可能小。
她想知道超市最少的数量,以及最小的距离之和。你能帮帮她吗?
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行一个正整数n,代表地图的大小。( 1<=n<=50 )
接下来的n行,每行一个长度为n的字符串,表示整个地图。保证输入合法。
输出描述:
输出两个整数,用空格隔开。分别代表超市的最小数量、最小的距离之和。
示例1
输入例子:
3
#.#
.**
.#
输出例子:
2 2
例子说明:
下标从1开始,第一个超市安排的位置是(1,2),第二个超市安排的位置是(3,3)。三个房子到超市的距离分别为1,1,0。
示例2
输入例子:
3
#
#
.**
.#
输出例子:
3 0
例子说明:
分别在三个房子上建3个超市即可。
示例3
输入例子:
2
.

*.
输出例子:
0 0
例子说明:
没有房子,所以不用造超市

题解

因为保证所有房子都能到达超市,所以先BFS搜索遍历,把整个图分割成几个部分,然后再暴力搜索每个位置造超市去其他房子的距离最小值即可。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
string mp[55];
struct Node
{
	int x,y,dp;
};
int xx[4] = {0,0,-1,1};
int yy[4] = {-1,1,0,0};
bool vis[55][55];
vector<pair<int, int> > bfs(int x,int y)
{
	queue<Node>q;
	Node t;
	t.x = x, t.y = y;
	q.push(t);
	vis[x][y] = true;
	vector<pair<int, int> >pos;
	while(!q.empty())
	{
		t = q.front();
		q.pop();
		pos.push_back(pair<int,int>(t.x,t.y));
		for(int i=0;i<4;i++)
		{
			Node w;
			w.x = t.x + xx[i];
			w.y = t.y + yy[i];
			if(w.x<0||w.x>=n||w.y<0||w.y>=n)continue;
			if(vis[w.x][w.y])continue;
			if(mp[w.x][w.y]=='*')continue;
			vis[w.x][w.y] = true;
			q.push(w);
		}
	}
	return pos;
}
bool cis[55][55];
int cal_dis(int x,int y)
{
	memset(cis,0,sizeof(cis));
	queue<Node>q;
	Node t;
	t.x = x, t.y = y, t.dp=0;
	q.push(t);
	cis[x][y] = true;
	int dis = 0;
	while(!q.empty())
	{
		t = q.front();
		q.pop();
		if(mp[t.x][t.y]=='#')dis += t.dp;
		for(int i=0;i<4;i++)
		{
			Node w;
			w.x = t.x + xx[i];
			w.y = t.y + yy[i];
			w.dp = t.dp + 1;
			if(w.x<0||w.x>=n||w.y<0||w.y>=n)continue;
			if(cis[w.x][w.y])continue;
			if(mp[w.x][w.y]=='*')continue;
			cis[w.x][w.y] = true;
			q.push(w);
		}
	}
	return dis;
}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>mp[i];
	memset(vis,0,sizeof(vis));
	int num=0, total_dis=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(vis[i][j])continue;
			if(mp[i][j]=='#')
			{
				vector<pair<int, int> > pos = bfs(i,j);
				int mi_dis = 1e9, dis;
				for(int k=0;k<pos.size();k++)
				{
				//	cout<<pos[k].first<<" "<<pos[k].second<<endl;
					dis = cal_dis(pos[k].first, pos[k].second);
				//	cout<<"dis="<<dis<<endl;
					mi_dis = min(mi_dis, dis);
				}
				num++;
				total_dis += mi_dis;
				//cout<<mi_dis<<endl;
				
			}
		}
	}
	cout<<num<<" "<<total_dis<<endl;
	return 0;
} 

在这里插入图片描述

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

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

相关文章

山东专升本计算机第七章-计算机网络基础

计算机网络基础 计算机网络系统 考点 6 计算机网络硬件 主体设备 • 称为主机 • 一般可分为中心站&#xff08;又称服务器&#xff09;和工作站&#xff08;客户机&#xff09; 连接设备 • 网卡 • 工作在数据链路层 • 网卡又称网络适配器&#xff0c;是连接主机和网…

【C++初阶】引用

一.概念 引用就是取别名&#xff0c;在语法上它不会开空间&#xff0c;而是和它引用的变量共用同一块空间。对引用的操作也就是对原来变量的操作。就像现实生活中给人取外号一样&#xff0c;不管是喊外号还是本名&#xff0c;指的都是那个人。 二.引用特性 1.引用类型必须和引用…

Java8 新特性讲解

一、Lambda表达式 Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力得到了提升。 二、函数式接口 &#…

【网课平台】Day15.Devops:持续集成与持续交付

文章目录 一、Devops1、什么是Devops2、什么是CI/CD3、Devops方案参考 二、人工部署1、项目打jar包2、生成镜像、创建容器 三、自动化部署1、代码提交到git2、修改pom.xml文件3、前端部署 一、Devops 1、什么是Devops 一个软件的生命周期包括&#xff1a;需求分析阶、设计、开…

SpringCloud:ElasticSearch之集群

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点单点故障问题&#xff1a;将分片数据在不同节…

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链&#xff0c;你在哪层呢&#xff1f;让chatGPT告诉你运维工作好&#xff0c;还是开发工作好问它几个问题1. 一个三年运维成长的案例和薪资2. 一个三年开发成长的案例和薪资3. 一个五年运维成长的案例和薪资4. 一个五年开发成长的案例和薪资5. 一个十…

云分析迁移:顺应需求

云提供了对新分析功能、工具和生态系统的访问&#xff0c;可以快速利用这些功能、工具和生态系统来测试、试点和推出新产品。然而&#xff0c;尽管迫在眉睫&#xff0c;但企业在将分析迁移到云时仍感到担忧。组织正在寻找能够帮助他们分配资源和集成业务流程的服务提供商&#…

Linux 服务器上安装和使用 Redis,只需这 4 步!

一、使用 yum 安装 Redis 使用以下命令&#xff0c;直接将 redis 安装到 linux 服务器&#xff1a; yum -y install redis 二、配置远程连接 a&#xff09;首先第一步&#xff0c;将 redis 配置文件下载到本地&#xff08;如果你熟悉 vim 操作&#xff0c;直接用 vim 编辑即可…

论文阅读《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID》

论文地址&#xff1a;https://arxiv.org/pdf/2206.02066.pdf 源码地址&#xff1a;https://github.com/XuJiacong/PIDNet 概述 针对双分支模型在语义分割任务上直接融合高分辨率的细节信息与低频的上下文信息过程中细节特征会被上下文信息掩盖的问题&#xff0c;提出了一种新的…

【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)

文章目录 1. 背景2. 技术点3 子模块依赖SpringBoot设置4. 多环境配置4.1 application.yml4.2 application-pro.yml 5. 多数据源配置5.1 yml配置5.2 自定义数据源在Java中配置5.2.1 PhoenixDataSourceConfig5.2.2 MysqlDataSourceConfig 6. 完整的Pom6. 测试6.1 Mapper配置6.2 方…

字符、块、网络设备

设备模型&#xff08;的意义&#xff09; 降低设备多样性带来的Linux驱动开发的复杂度&#xff0c;以及设备热拔插处理、电源管理等&#xff0c;Linux内核提出了设备模型概念。设备模型将硬件设备归纳、分类&#xff0c;然后抽象出一套标准的数据结构和接口。驱动的开发&#…

Java项目上线之云服务器环境篇(四)——Redis的安装与配置

Java项目上线之云服务器环境篇&#xff08;四&#xff09;——Redis的安装与配置 在我们的项目里可能会用到Redis缓存&#xff0c;需要对Redis进行简单的配置。 1、我们的redis最好放在一个事先安装好的文件夹里&#xff0c;这样更方便于管理。 例如&#xff1a; redis我是放在…

前端开发:JS的事件循环执行机制详解

前言 在前端开发中&#xff0c;涉及到JS原生的使用原理是非常重要的知识点&#xff0c;尤其是在实际工作过程中会遇到各种复杂的业务需求场景&#xff0c;以及具体开发中可能会遇到一些涉及基于JS原理的使用&#xff0c;这都要求开发者能够很好的了解和掌握JS原生的常用原理。J…

jvm之类加载器

写在前面 当我们通过javac命令将java源代码编译为Java字节码后&#xff0c;必须通过类加载器将其加载到jvm中才能运行&#xff0c;所以类加载器是jvm中非常重要的一个组成部分&#xff0c;本文我们就一起来看下吧&#xff01; 1&#xff1a;类的生命周期 类的生命周期如下图…

leetcode刷题之回文链表and最长回文子串

234.回文链表 方法一:找中间结点,断开链表,后一段链表进行反转 思路:①找中间结点:使用快慢指针fast,slow,fast每次走两个,slow每次走一个; 如果链表的个数是奇数个,那么最后slow指向中间节点 如果链表的个数是偶数个,那么最后slow指向中间两个节点的后一个 ②使用prev指针保…

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

八、可以扩展我们的记号到有两个参数n和m的情形&#xff0c;其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m)&#xff0c;用O(g(n, m))来表示以下函数集&#xff1a; O(g(n, m)) { f(n, m): 存在正常量c、和&#xff0c;使得对所有n>n0或m>m0&#xff…

unity 性能优化之合批和剔除

批次对渲染的性能影响是比较大的&#xff0c;批次过多会导致cpu提交的次数过多&#xff0c;导致每帧渲染时间过长&#xff0c;所以我们需要对其优化&#xff0c;减少Bathches数量和SetPassCall次数。 批次合并的方法有多种&#xff0c;下面一一列出&#xff1a; 手动合批 将相…

CRM系统多少钱一套?盘点主流各大CRM系统价格

阅读本文你将了解&#xff1a;1.CRM定价规则&#xff1b;2.各大CRM系统报价&#xff08;CRM系统多少钱一套&#xff09;;3.CRM系统费用构成。 一、CRM定价规则 很多企业都寻求使用CRM系统来管理客户关系&#xff0c;从而优化管理流程&#xff0c;提升业绩。 对于企业而言&…

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1985-2021年 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;各省NJ、社会统计NJ、人口和就业NJ 4、指标包括&#xff1a;省第一产业就业人数、省第…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…