01矩阵-【BFS】
01矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 ,方格斜方向不计算距离。
示例 1:
输入:
[0 0 0
0 1 0
0 0 0]
输出:
[0 0 0
0 1 0
0 0 0]
示例 2:
输入:
[0 0 0
0 1 0
1 1 1]
输出:
[0 0 0
0 1 0
1 2 1]
注意:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
思路:
对每个值为0的点进行bfs,不断更新最短路径,因为元素个数不超过10000所以最长距离也就是199,先把res[][]数组的值设置成205即可,
记得要加标记数组,防止重复访问,会陷入死循环,我第一次就是忘记加了。 对0进行bfs搜索要比对1进行bfs搜索要好,因为前者更方便剪枝。
#include <iostream>
#include <math.h>
#include <queue>
#include <string.h>
using namespace std;
// 方向数组 上右下左
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
// 地图
int nums[105][105];
// 是否访问过 0代表没访问过,1代表访问过
int vis[105][105];
// 结果
int res[105][105];
// 地图长度
int n;
bool check(int x, int y)
{
// 判断在界内,并且没被访问过,并且值为1。(值为0的话,肯定是从0这个点向其他点扩展,比原先的点更近一点)
return x >= 0 && y >= 0 && x < n && y < n && vis[x][y] == 0 && nums[x][y] == 1;
}
void bfs(int x, int y)
{
res[x][y] = 0;
queue<pair<int, int>> q;
memset(vis, 0, sizeof(vis));
vis[x][y] = 1; //设置(x,y)访问过
q.push({x, y});
while (!q.empty())
{
// len++;
pair<int, int> t = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int newx = t.first + dx[i];
int newy = t.second + dy[i];
if (check(newx, newy))
{
// 将新点标记访问过
vis[newx][newy] = 1;
// 上一个点的长度+1,便是bfs层数。 刷新最短距离。
res[newx][newy] = min(res[t.first][t.second] + 1, res[newx][newy]);
q.push({newx, newy});
}
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> nums[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
res[i][j] = 205;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (nums[i][j] == 0)
bfs(i, j);
cout << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << res[i][j] << " ";
cout << endl;
}
return 0;
}
01矩阵-【BFS】的更多相关文章
- Leetcode 542:01 矩阵 01
Leetcode 542:01 矩阵 01 Matrix### 题目: 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . Given a matr ...
- [EOJ Monthly 2018.10][C. 痛苦的 01 矩阵]
题目链接:C. 痛苦的 01 矩阵 题目大意:原题说的很清楚了,不需要简化_(:з」∠)_ 题解:设\(r_i\)为第\(i\)行中0的个数,\(c_j\)为第\(j\)列中0的个数,\(f_{i,j ...
- Leetcode 542.01矩阵
01矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 ...
- MATLAB小函数:将列向量转化为0-1矩阵
MATLAB小函数:将列向量转化为0-1矩阵 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 将列向量转化为0-1矩阵,例如 A = 1 2 1 5 3 ...
- 19牛客暑期多校 round2 H 01矩阵内第二大矩形
题目传送门//res tp nowcoder 目的 给定n*m 01矩阵,求矩阵内第二大矩形 分析 O(nm)预处理01矩阵为n个直方图,问题转换为求n个直方图中的第二大矩形.单调栈计算,同时维护前二 ...
- Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
542. 01 矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 ...
- 矩阵BFS
leetcode 1091矩阵BFS 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, ...
- [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)
题目链接:http://acm.swust.edu.cn/problem/1126/ Time limit(ms): 1000 Memory limit(kb): 65535 上一周里,患有XX症的哈 ...
- 【leet-code】542. 01 矩阵
题目描述 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 ...
- Tricks(四十七)—— 布尔矩阵(0-1矩阵)取反
假定 X 是一个 0-1 元素构成的布尔矩阵,则对其取反,0 变成 1,1 变为 0(True 变为 False,False 变成 True),只需要一步简单的操作: Y = (X == False)
随机推荐
- husky 7.0.4 git hooks 前端 commit 钩子 git转svn [已解决]
husky 7 的安装,注意下版本 第一步 安装 cnpm install husky@7.0.4 --save-dev 第二步 在package.json script加入 "prepar ...
- 提升地理空间分析效率,火山引擎ByteHouse上线GIS能力
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在数字化时代,地理空间分析(Geospatial Analytics)成为辅助企业市场策略洞察的重要手段.无论是广 ...
- Python使用os模块创建带时间戳的文件夹
直接上源码: # 导入os模块 import os import time # 创建文件夹函数 def mkdir(path): # os.path.exists 函数判断文件夹是否存在 folder ...
- jsp相对路径绝对路径
jsp相对路径绝对路径 很长一段时间纠结过JSP中的相对路径和绝对路径,也研究过一段时间,今天趁着有点时间,记下来,也有大家分享一下. 1)我们先来理解一下相对路径 首先还是我们的开始,建一个WEB项 ...
- 记一次由于linux buff cache引发的问题
简介 在前一段时间,在帮一个朋友处理一个问题是时,遇到这么一个问题.功能做的是一个vue分片式上传,在测试定位问题时,我就发现,分片上传14次,其中有那么一两次是上传失败,导致文件上传不完整.报了以下 ...
- http内网穿透CYarp[开源]
0 前言 在物联网领域中,mqtt消息一直是海量设备连接到平台的标配协议,而平台向移动端开放的操作接口往往是http协议,这就要求平台为两种协议作消息一一适配.在某些情况下,这些设备是有操作系统的li ...
- 记录--写一个高德地图巡航功能的小DEMO
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 风格设置 加载地图 使用AMapLoader.load加载地图,从控制台 申请一个属于自己的key import AMapLoader f ...
- uniapp热更新和整包更新思路
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 我们知道,在打包Android App之前,我们需要先通过HX生成打包资源.如果是通过cli创建的项目,则通过以下命令生成打包资源: ya ...
- 一道题开始认识Symbol
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近每天学习的时候,发现了一道很有趣的面试题 1.const [a, b] = { a: 100, b: 200 } 2.console. ...
- Python利用pandas拆分大型的csv文件
当将大型CSV文件拆分成较小的文件时,您可以使用Python的Pandas库来处理 导入必要的库 import pandas as pd 定义拆分函数 当定义拆分函数时,我们将在以下步骤中处理CSV文 ...