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)
随机推荐
- 使用Mockito与Squaretest进行单元测试.
项目开发过程中,不少公司都要求写单元测试的代码,可以提高代码的质量,并且可以减少出现BUG的概率. 对于中小型公司来说,对单元测试不做硬性要求,不写最好.因为还是需要一定的工作量,在保证代码质量和性能 ...
- SQL语句之索引操作
目录 索引 创建索引 CREATE INDEX 语句 CREATE UNIQUE INDEX 语句 索引多个列 删除索引 参考资料 索引 可以在表中创建索引,以便更加快速高效地查询数据. 用户无法看到 ...
- 市场主流的G-sensor芯片盘点
一 前记 1.简介 随着可穿戴智能硬件的广泛发展,G-sensor成了一个必不可少的器件.梳理,测试和运用这些传感器.是做可穿戴产品必不可少的环节. 二 产品解析 1.ST的G-sensor型号LIS ...
- 网页上发起qq聊天
找到以前记录的小笔记,同步过来吧 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"& ...
- 手动将jar包安装到本地仓库并使用tomcat运行
参考,欢迎点击原文:https://www.cnblogs.com/panchanggui/p/10696458.html 公司有个老项目是spring的,要我们自己本地安装,我发现我maven一直报 ...
- C++保证线程安全的方式
1.互斥量 可以确保同一时间只有一个线程访问临界区,防止出现竞态条件. 2.原子操作 std::atomic<int> mutex(1); 对原子变量的操作是线程安全的. 3.读写锁 st ...
- Android Studio源码导入与调试
从事Android开发都需要涉及到Android源码的阅读,特别是系统应用或者Framework开发,读代码的时间远远比写代码的时间更多. 一. 生成iml与ipr 在Android Studio中导 ...
- 1、Azure Devops之什么是Azure DevOps
什么是Azure DevOps 1.师出名门:是微软推出的一个集项目管理.开发管理.测试管理的一个服务套件. 2.历史:前身是微软在2005年推出的Team foundation Server一个专门 ...
- Android组件化开发实践和案例分享
目录介绍 1.为什么要组件化 1.1 为什么要组件化 1.2 现阶段遇到的问题 2.组件化的概念 2.1 什么是组件化 2.2 区分模块化与组件化 2.3 组件化优势好处 2.4 区分组件化和插件化 ...
- 关于数据校验Bean Validation的学习
1,导相关依赖 2,常用的Validation注解 @NotNull: 标记字段不能为 null @NotEmpty: 标记集合字段不为空(至少要有一个元素) @NotBlank: 标记字段串字段不能 ...