当前位置: 首页 > wzjs >正文

网站功能说明怎么做电脑培训网上课程

网站功能说明怎么做,电脑培训网上课程,制作图网址,空气炸锅做糕点的网站题干 翻译 给定一个 nm 的网格地图,包含以下元素: .:表示荒地(可以修建道路)。 #:表示岩石(不可通行)。 数字 1、2、3:分别表示三个国家的位置。 目标:将…

题干

在这里插入图片描述

翻译

给定一个 n×m 的网格地图,包含以下元素:

  • .:表示荒地(可以修建道路)。

  • #:表示岩石(不可通行)。

  • 数字 1、2、3:分别表示三个国家的位置。

目标:将最少数量的荒地(.)改造成道路,使得三个国家之间互相连通(即任意两国之间存在一条路径)。如果无法实现,输出 -1。

数据范围:

1 ≤ n, m ≤ 1000(即网格最大为 1000×1000)。

分析

  • 三个国家之间两两连通(即 1↔2、1↔3、2↔3 均需有路径)。
  • 路径只能通过荒地(.)或已有数字(国家),不能穿过岩石(#)。
  • 如果三个国家中有任意一个被岩石包围,无法与其他国家连通,则输出 -1。

面对这题可能先想到的就是求出每一个荒地到每一个国家的最短距离,求一个点到矩阵中其他所有点的距离就要进行一次完整的BFS,如果现在求所有荒地到其他点的最短距离,那么时间复杂度就会相当高,而且还存在非常多的细节判断,比如某两个国家是连通的,但是依次求每个荒地到国家的最短距离,是不能直接判断国家是否连通的,如果两个国家连通,荒地到最近的那个国家就行了,是不用再去找另外一个国家的,这就又需要单独处理这种情况,此外还有很多情况就不一一举例了。
总之,正难则反,这题我们反过来思考,求荒地到各个国家的最短距离难,那我们就求每个国家到荒地的距离,这样就只用分三个情况,因为只有三个国家,每个国家在求到所有荒地的距离的时候就是一次多源BFS。所以这题就只需要进行三次多源+01BFS就解决了,最后再统计哪个点到三个国家的距离之和最短,那就是我们想要的答案。

题解

#include<iostream> 
#include<deque>
#include<cstring>
using namespace std;
typedef pair<int,int> PII;
int n,m;
const int N = 1e3 + 10;
char p[N][N];
int dist[4][N][N];int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};void bfs(int pos)
{memset(dist[pos],-1,sizeof dist[pos]);//多源BFS deque<PII> q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(p[i][j] - '0' == pos){q.push_front({i,j});dist[pos][i][j] = 0;}	} }	//01BFSwhile(q.size()){auto t = q.front(); q.pop_front();int x = t.first, y = t.second;for(int i=0;i<4;i++){int a = x + dx[i], b = y + dy[i];if(a >= 1 && a <= n && b >= 1 && b <= m && p[a][b] != '#') //跳过非法{//计算边权 int w = (p[a][b] == '.' ? 1 : 0);//第一次访问(一定要入队) if(dist[pos][a][b] == -1){dist[pos][a][b] = dist[pos][x][y] + w;if(w) q.push_back({a,b});else q.push_front({a,b});}//再次访问比大小 else if(dist[pos][x][y] + w < dist[pos][a][b]){//松弛 dist[pos][a][b] = dist[pos][x][y] + w;} 					}}}
}int main()
{cin >> n >> m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin >> p[i][j];	} }	bfs(1);bfs(2);bfs(3);int ret = 0x3f3f3f3f;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(p[i][j] == '#') continue;//把合法的位置距离1、2、3号国家的距离全部提取出来 int x = dist[1][i][j], y = dist[2][i][j], z = dist[3][i][j];//即使合法了,这个位置也可能到不了,这样的点是不能参与更新结果的 if(x == -1 || y == -1 || z == -1) continue; //判断这个位置是在荒地上还是在国家上if(p[i][j] == '.') ret = min(ret,x + y + z - 2); //注意这里-2是为了减掉重复计算的路程,我们再以某个点为中心计算它到三个国家的距离的时候,这个点只需要计算一次,所以就减去多余算上的两次else ret = min(ret,x + y + z); } }//判断retif(ret == 0x3f3f3f3f) cout << -1 << endl;else cout << ret << endl; return 0;
}
http://www.dtcms.com/wzjs/379093.html

相关文章:

  • 做校园网站的公司软文广告经典案例分析
  • 做外贸没有网站需要什么条件社群营销活动策划方案
  • 想学网店运营去哪里学啊网站推广seo招聘
  • 网站建设功能模块百度搜索一下百度
  • 给有后台的网站做网页手机怎么自己制作网页
  • 百度网址大全网址导航武汉seo关键词排名
  • 南川区 网站集约化建设方案seo短视频发布页
  • 建设网站总结报告合肥seo网站建设
  • .net网站开发实训企业宣传软文范例
  • 如何用电子邮箱做网站天津百度网站排名优化
  • 怎么制作网站布局网络销售怎么找客户
  • 镇江网站建设报价企业网站建设目标
  • 网站开发需要什么语言近期网络营销的热点事件
  • 阿里网站建设视频教程怎样建立网站平台
  • 合肥做网站优化买卖友情链接
  • 做个静态网站多少钱竞价排名是什么意思
  • 义乌市网站建设代理百度seo技术优化
  • 阳春县建设局网站百度注册网站
  • 网站做搜索引擎优化seo服务商排名
  • 科技股份公司网站模板买链接
  • 网站后台制作表格为什么中国禁止谷歌浏览器
  • asp.net网站开发平面设计培训班学费一般多少
  • java ee博客网站开发免费自助建站哪个最好
  • 网站首页菜单栏模块怎么做的福州seo网站推广优化
  • 苏州市住房和城乡建设局网站口碑好的设计培训机构
  • 泗县做网站三亚网络推广
  • 做地产的设计网站下载班级优化大师并安装
  • 没有专项备案的网站seo优化轻松seo优化排名
  • 南阳网站排名公司企业网站建设
  • 淘宝网站珠海网站建设