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

AcWing 173.矩阵距离

首先就是上一个时间超时的做法:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include <iomanip>
#include<sstream>
#include<numeric>
#include<map>
#include<limits.h>
#include<set>
#define int long long
#define MAX 1050
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef pair<int, int> PII;
int n, m;
int counts=INT_MAX;
char maps[MAX][MAX];
int dist[MAX][MAX];
int brr[MAX][MAX];
int a, b;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
queue<PII>q;
vector<int>nextVisit;
void bfs(int x, int y) {memset(dist, -1, sizeof dist);q.push({ x,y });dist[x][y] = 0;while (!q.empty()) {auto  t = q.front();q.pop();for (int i = 0; i < 4; i++) {int a = t.first + dx[i];int b = t.second + dy[i];if (dist[a][b] >= 0)continue;if (a<1 || a>n || b<1 || b>m)continue;q.push({ a,b });dist[a][b] = abs(x - a) + abs(y - b);}}if (maps[x][y] == '0') {_for(i, 1, n + 1) {_for(j, 1, m + 1) {if (maps[i][j] == '1') {counts = min(counts, dist[i][j]);}}}brr[x][y] = counts;}elsebrr[x][y] = 0;
}
signed main() {ios::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);cin >> n >> m;_for(i, 1, n + 1) {_for(j, 1, m + 1)cin >> maps[i][j];}_for(i, 1, n + 1) {_for(j, 1, m + 1) {bfs(i, j);counts = INT_MAX;}}_for(i, 1, n + 1) {_for(j, 1, m + 1) {cout << brr[i][j] << " ";}cout << endl;}return 0;
}

具体原因不明,但是对于1000左右这里的数是不适用的,其他情况下都是可以的。

后来看了题解之后试着优化了一下。

其实和上面的思路是一样的,就是对于每一个点都进行遍历BFS,算出到各自点的距离,之后,再统一处理b矩阵,直接把距离最短的放里面。

但这样处理好像会很费劲,对于多个数组进行赋值和交换和变值,会超出时间限制也是正常的。

这里可以换一种思路进行优化:

说到底,如果对于某一点来说,这一点字符是’1‘,距离就直接是0了,不用担心。

如果是这一点字符是’0‘,那么我们需要计算这一点到’1‘的最短距离,其实换过来说,也就是所有字符是’1‘到达这一点的距离的最小值,也就是多源BFS的问题,所有’1‘字符同时扩散,看看各自的点距离。

上代码:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include <iomanip>
#include<sstream>
#include<numeric>
#include<map>
#include<limits.h>
#include<set>
#define int long long
#define MAX 1050
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef pair<int, int> PII;
int n, m;
int counts=INT_MAX;
char maps[MAX][MAX];
int dist[MAX][MAX];
int brr[MAX][MAX];
int a, b;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
queue<PII>q;
vector<int>nextVisit;
void bfs() {memset(dist, -1, sizeof dist);_for(i, 1, n + 1) {_for(j, 1, m + 1) {if (maps[i][j] == '1'){q.push({ i,j });dist[i][j] = 0;}}}while (!q.empty()) {auto t = q.front();q.pop();_for(i, 0, 4) {int a = dx[i] + t.first;int b = dy[i] + t.second;if (a<1 || a>n || b<1 || b>m)continue;if (dist[a][b] >= 0)continue;q.push({ a,b });dist[a][b] = dist[t.first][t.second] + 1;}}
}
signed main() {ios::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);cin >> n >> m;_for(i, 1, n + 1) {_for(j, 1, m + 1)cin >> maps[i][j];}bfs();_for(i, 1, n + 1) {_for(j, 1, m + 1) {cout << dist[i][j] << " ";}cout << endl;}return 0;
}

相关文章:

  • Excel·VBA数组平均分组问题
  • Kubernetes 知识体系 系列一
  • Python最强自动化神器!
  • MySQL 日志:undo log、redo log、binlog 有什么用?
  • iPhone的iOS系统:定义移动智能体验,引领科技潮流之巅
  • iOS - Runtime-API
  • 【爬虫基础】第3讲 常见浏览器User-Agent大全
  • C++从入门到精通——命名空间
  • 记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端
  • 41-Vue-webpack基础
  • 6、kubenetes 卷
  • RAFT:让大型语言模型更擅长特定领域的 RAG 任务
  • nodejs的线程模型和libuv库的基本使用
  • Swagger3探索之游龙入海
  • golang kafka sarama 源码解析
  • JS 中的深拷贝与浅拷贝
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • egg(89)--egg之redis的发布和订阅
  • Java的Interrupt与线程中断
  • Java多态
  • Netty源码解析1-Buffer
  • php ci框架整合银盛支付
  • python学习笔记-类对象的信息
  • Redis中的lru算法实现
  • select2 取值 遍历 设置默认值
  • SQL 难点解决:记录的引用
  • Sublime text 3 3103 注册码
  • windows下如何用phpstorm同步测试服务器
  • 码农张的Bug人生 - 见面之礼
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 手写双向链表LinkedList的几个常用功能
  • 树莓派 - 使用须知
  • 算法---两个栈实现一个队列
  • 赢得Docker挑战最佳实践
  • 在Mac OS X上安装 Ruby运行环境
  • linux 淘宝开源监控工具tsar
  • 数据可视化之下发图实践
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​卜东波研究员:高观点下的少儿计算思维
  • #if和#ifdef区别
  • #WEB前端(HTML属性)
  • (06)Hive——正则表达式
  • (2.2w字)前端单元测试之Jest详解篇
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八十八)VFL语言初步 - 实现布局
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)docker:Dockerfile构建容器运行jar包
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)linux文件内容查看
  • .net core 6 集成和使用 mongodb